Saya tidak tahu apakah ini penting, tetapi Anda dapat membuat subkulit:
$ (cd /var/log && cp -- *.log ~/Desktop)
Direktori hanya diubah untuk subkulit itu, jadi Anda menghindari pekerjaan yang memerlukan cd -
setelah itu.
Beberapa program memiliki opsi yang dapat Anda gunakan untuk memberi tahu mereka chdir(2) sendiri (misalnya GNU tar -C
/--directory
).
Di luar program semacam itu, sesuatu harus chdir . Anda dapat menulis dan menggunakan semacam program “biner” terkompilasi 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 ingin menghindari "cd back", maka Anda dapat menggunakan subkulit untuk mengisolasi efek cd dari instance shell kerja Anda.
(cd /path/to/dir && some command)
Anda dapat mengemasnya dalam fungsi shell.(Saya menjatuhkan -d
opsi dari contoh penggunaan Anda karena ada sedikit gunanya 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
Bukan untuk merusak nilai jawaban yang diberikan oleh orang lain, tapi saya yakin yang Anda inginkan adalah ini:
(cd /path/to && ./executable [ARGS])
Perhatikan tanda kurung untuk memanggil cd
dalam subkulit.