it-swarm-id.com

Jalankan perintah tertentu dalam direktori yang diberikan tanpa perintah itu?

Apakah ada cara untuk menjalankan perintah di direktori lain tanpa harus cd di sana? Saya tahu bahwa saya hanya bisa cd masuk dan cd keluar, tapi saya hanya tertarik pada kemungkinan untuk tidak melanjutkan langkah-langkah tambahan :)

43
Naftuli Kay

Saya tidak tahu apakah ini penting, tetapi Anda dapat membuat subkulit:

$ (cd /var/log && cp -- *.log ~/Desktop)

Direktori ini hanya diubah untuk subkulit itu, jadi Anda menghindari pekerjaan yang membutuhkan cd - sesudahnya.

56
Michael Mrozek

Beberapa program memiliki opsi yang dapat Anda beri tahu --- chdir (2) sendiri (mis. GNU tar _ -C/--directory).

Di luar program semacam itu, sesuatu harus chdir . Anda dapat menulis dan menggunakan semacam program "biner" yang dikompilasi alih-alih meminta Shell melakukannya, tetapi mungkin tidak akan menghasilkan banyak manfaat.

Dalam komentar di jawaban lain, Anda memberi contoh:

execindirectory -d /var/log "cp *.log ~/Desktop"

Sejak *.log pola diperluas oleh Shell itu sendiri (bukan cp ), sesuatu harus chdir ke direktori sebelum Shell mengevaluasi perintah Anda.

Jika Anda hanya tertarik untuk menghindari "cd back", maka Anda dapat menggunakan subshell untuk mengisolasi efek dari cd dari instance Shell Anda yang berfungsi .

(cd /path/to/dir && some command)

Anda dapat mengemas ini dalam fungsi Shell. (Aku menjatuhkan -d pilihan dari contoh penggunaan Anda karena ada sedikit poin untuk perintah ini jika direktori sebenarnya opsional.)

runindir() { (cd "$1" && shift && eval "[email protected]"); }

runindir /var/log 'cp *.log ~/Desktop'  # your example
runindir /var/log cp \*.log \~/Desktop  # eval takes multiple args

runindir /var/log cp \*.log ~/Desktop   # it is okay to expand tilde first
14
Chris Johnsen

Bukan untuk merusak nilai jawaban yang diberikan oleh orang lain, tapi saya percaya apa yang Anda inginkan apakah ini:

(cd /path/to && ./executable [ARGS])

Perhatikan parens yang akan dipanggil cd dalam sub-Shell.

11
alex

Berikut adalah sesuatu yang seharusnya membuat Anda cd kembali ke tempat Anda sebelumnya (menggunakan Bash), karena tidak lupa untuk melakukannya sepertinya menjadi tujuan pertanyaan:

# Save where you are and cd to other dir
pushd /path/to/dir/that/needs/to/be/current/dir

run-your-command

# Get back where you were at the beginning.
popd

(EDIT: versi yang sedikit lebih pendek, terima kasih kepada @ Random832)

4
Bruno

Sayangnya, contoh Anda:

execindirectory -d /var/log "cp *.log ~/Desktop"

tidak perlu perubahan ke dir, karena

cp /var/log/*.log ~/Desktop

akan melakukan hal yang sama. Tidak bisakah Anda mendekati masalah Anda yang sebenarnya? Karena kita mungkin tahu solusi yang lebih baik untuk itu juga.

Cara rumit untuk menyelesaikan masalah Anda, yang jauh dari keanggunan solusi Michaels, adalah penggunaan find, yang memiliki sakelar '-execdir' untuk dijalankan dalam direktori, tempat file ditemukan. Diadopsi dengan buruk untuk contoh Anda:

find /var/log -maxdepth 1 -type f -name "*.log" -execdir echo cp {} ~/Desktop ";"

Mungkin ini berguna untuk masalah Anda yang sebenarnya. -okdir bukannya -execdir akan meminta Anda untuk mengonfirmasi setiap doa.

-okdir dan -execdir mungkin perlu diinstal gnu-find, yang biasanya digunakan di Linux.

2
user unknown

Bagaimana tentang ./your/path/command.sh?

1
bdictator