Apakah ada utilitas POSIX (atau setidaknya yang populer) untuk mengatur direktori kerja saat ini ketika menjalankan program?

20

Kami memiliki env (1) untuk memodifikasi lingkungan perintah yang ingin kami jalankan (misalnya env MANPAGER=more man dtrace). Apakah ada sesuatu yang serupa tetapi untuk memodifikasi direktori bahwa perintah akan dimulai?

Idealnya, saya ingin terlihat seperti ini:

theMagicCommand /new/cwd myProgram

Dengan cara ini bisa "dirantai" dengan perintah env (1) lainnya, misalnya,

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

Sejauh ini saya dapat memikirkan solusi berikut, yang sayangnya tidak memiliki antarmuka yang sama dengan env (1):

cd /new/cwd && myProgram

Saya juga bisa membuat skrip shell sederhana seperti ini:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

tapi saya mencari sesuatu yang sudah ada (setidaknya di macOS dan FreeBSD).

myProgrambelum tentu aplikasi desktop (dalam hal ini saya bisa menggunakan kunci Path dalam file .desktop ).

Mateusz Piotrowski
sumber
6
Mengapa cd /new/cwd && env VAR=value myProgramtidak memenuhi kriteria Anda?
jpaugh
Itu sudah ada dalam pertanyaan, di mana M. Piotrowski menjelaskan bahwa itu bukan antarmuka yang sama dengan env. Lihatlah env. Bandingkan dengan rtprio, idprio, numactl, jexec, chrt, dan memang perintah dalam toolsets disebutkan dalam jawaban. Ada sebuah pola, dan itu adalah pemuatan rantai.
JdeBP
3
Apa yang Anda maksud dengan "antarmuka"? Dan mengapa tidak digunakan (cd the/cwd; cmd)?
Konrad Rudolph
2
@KonradRudolph Misalnya, Anda tidak dapat dengan mudah meneruskan (cd the/cwd; cmd)ke env (1) tanpa membungkusnya dengan sh (1).
Mateusz Piotrowski

Jawaban:

19

AFAIK, tidak ada utilitas khusus seperti itu di peti alat POSIX. Tapi itu umum untuk memanggil shuntuk mengatur lingkungan (cwd, limit, stdout / in / err, umask ...) sebelum menjalankan perintah seperti yang Anda lakukan dalam shskrip Anda .

Tetapi Anda tidak harus menulis skrip itu dalam file, Anda bisa langsung menuliskannya:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(dengan asumsi direktori tidak -). Menambahkan CDPATH=(kalau-kalau ada satu di lingkungan) dan -Puntuk itu berperilaku lebih seperti lurus chdir().

Atau, Anda bisa menggunakan perlyang chdir()langsung chdir()keluar dari kotak.

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args
Stéphane Chazelas
sumber
Oh ya. Ini merupakan variasi skrip yang sangat berguna yang saya sertakan dalam pertanyaan saya. Saya takut utilitas yang saya cari tidak ada karena fungsinya sudah tersedia dengan sh (1) oneliner yang relatif singkat.
Mateusz Piotrowski
8
Jika sudah berjalan sh, Anda juga bisa melakukannya (cd /wherever && exec /my/command). Secara ()implisit membuka subkulit untuk menjalankan perintah yang dibungkus, dan tentu saja, execmenyingkirkan proses shell ekstra secepat /my/commandmulai berjalan.
jpaugh
2
Itu disarankan dalam jawaban yang sekarang dihapus. Penanya menjelaskan bahwa itu bukan jawaban atas apa yang ditanyakan.
JdeBP
15

Perangkat yang digunakan di dunia daemontools, dan di tempat lain, memiliki ini dan lebih dari itu; telah bertahun-tahun; dan tersedia secara luas.

  • Pelakunya Wayne Marshall memiliki runtool:

    runtool -c / new / cwd myProgram
  • Eksekutif Laurent Bercot memiliki cd:

    cd / new / cwd myProgram
  • toolset nosh saya memiliki chdir:

    chdir / new / cwd myProgram

Semua ini adalah alat pemuat rantai, yang dirancang untuk digunakan dalam rantai yang persis seperti ini. Ada berbagai pilihan alat pemuatan berantai dalam toolkit ini untuk tujuan lain.

Bacaan lebih lanjut

  • /unix//a/353698/5132
  • Laurent Bercot (2018-08-01). "Referensi". execline . skarnet.org.
  • Laurent Bercot (2018-11-08). "Referensi". s6 . skarnet.org.
  • Jonathan de Boyne Pollard (2018). "Daftar perintah dan alat ". Panduan nosh . Perangkat lunak.
JdeBP
sumber
11

Ada program yang begitu populer. Hal ini disebut ... terus ke kursi Anda ... drumroll ... env. Versi GNU, karena versi 8.28, bukan POSIX, memiliki -Copsi yang memungkinkan Anda mengatur direktori seperti yang Anda butuhkan:

    NAMA
           env - menjalankan program dalam lingkungan yang dimodifikasi

    RINGKASAN
           id [OPTION] ... [-] [NAME = VALUE] ... [PERINTAH [ARG] ...]

    DESKRIPSI
           Tetapkan setiap NAME ke VALUE di lingkungan dan jalankan COMMAND.

           Argumen wajib untuk opsi lama juga wajib untuk opsi pendek.

           -i , --ignore-environment
                  mulai dengan lingkungan kosong

           -0 , --null
                  akhiri setiap jalur keluaran dengan NUL, bukan baris baru

           -u , --unset = NAME
                  hapus variabel dari lingkungan

           -C , --chdir = DIR
                   mengubah direktori kerja menjadi DIR

           --help tampilkan bantuan ini dan keluar

           --versi
                  informasi versi keluaran dan keluar

           A belaka - menyiratkan -i . Jika tidak ada PERINTAH, cetak lingkungan yang dihasilkan.

n. 'kata ganti' m.
sumber
Keren, meskipun tidak tersedia di luar kotak pada macOS dan FreeBSD.
Mateusz Piotrowski
1

Beberapa program memiliki opsi untuk ini, seperti Git:

-C <path>

Jalankan seolah-olah gitdimulai di <path>bukan direktori kerja saat ini.

dan membuat:

-C dir, --directory=dir

Ubah ke direktori dirsebelum membaca makefiles atau melakukan hal lain.

dan Tar:

-C, --directory=DIR

Ubah ke DIRsebelum melakukan operasi apa pun. Opsi ini peka terhadap pesanan, artinya memengaruhi semua opsi yang mengikuti.

Steven Penny
sumber
Iya nih. Meskipun pertanyaan saya adalah bagaimana jika myProgramtidak memberikan opsi seperti itu ... Terima kasih atas kontribusi Anda tetapi saya khawatir itu tidak menjawab pertanyaan saya sama sekali.
Mateusz Piotrowski