Menggunakan shell Linux , bagaimana cara memulai program dengan direktori kerja yang berbeda dari direktori kerja saat ini?
Sebagai contoh, saya memiliki file biner helloworld
yang membuat file hello-world.txt
di direktori saat ini .
File ini ada di dalam direktori /a
.
Saat ini, saya berada di direktori /b
. Saya ingin menjalankan program saya ../a/helloworld
dan mendapatkan hello-world.txt
tempat di direktori ketiga /c
.
linux
shell
environment
Anton Daneyko
sumber
sumber
su
me-reset direktori kerja ke direktori home pengguna yang Anda tentukan sebelum menjalankan-c
perintah apa pun . Ini sangat membantu saya.Jawaban:
Panggil program seperti ini:
Tanda kurung menyebabkan sub-shell untuk melahirkan. Sub-shell ini kemudian mengubah direktori kerjanya menjadi
/c
, lalu mengeksekusihelloworld
dari/a
. Setelah program keluar, sub-shell berakhir, mengembalikan Anda ke prompt Anda dari shell induk, di direktori Anda mulai.Penanganan kesalahan: Untuk menghindari menjalankan program tanpa mengubah direktori, mis. Ketika salah eja
/c
, lakukan eksekusi denganhelloworld
syarat:Mengurangi penggunaan memori: Untuk menghindari hilangnya memori subkulit saat hello world dieksekusi, panggil
helloworld
via exec:[Terima kasih kepada Josh dan Juliano karena telah memberi tip untuk meningkatkan jawaban ini!]
sumber
Mirip dengan jawaban David Schmitt , ditambah saran Josh, tetapi tidak membiarkan proses shell berjalan:
Cara ini lebih mirip dengan cara Anda biasanya menjalankan perintah di shell. Untuk melihat perbedaan praktis, Anda harus lari
ps ef
dari shell lain dengan setiap solusi.sumber
Opsi yang tidak memerlukan subkulit dan dibangun untuk mem-bash
Demo:
sumber
pushd SOME_PATH && run_stuff && popd
- jika run_stuff gagal, maka popd tidak akan dieksekusi.set -e
dalam file dan kemudian akan gagalpopd
.pushd "${SOME_PATH}" && run_stuff; popd
lebih baik daripada jawaban saat ini, karena semantik pushd / popd secara khusus dirancang untuk situasi ini masuk ke beberapa direktori dan kemudian kembali ke yang asli.sumber
Saya selalu berpikir alat UNIX harus ditulis sebagai filter, membaca input dari stdin dan menulis output ke stdout. Jika memungkinkan Anda bisa mengubah biner helloworld Anda untuk menulis konten file teks ke stdout daripada file tertentu. Dengan begitu Anda bisa menggunakan shell untuk menulis file Anda di mana saja.
$ cd ~ / b
$ ~ / a / helloworld> ~ / c / helloworld.txt
sumber
Ubah saja "&&" terakhir menjadi ";" dan itu akan cd kembali tidak masalah jika perintah gagal atau berhasil:
sumber
Salah satu cara untuk melakukannya adalah dengan membuat skrip shell wrapper.
Script shell akan mengubah direktori saat ini ke / c, kemudian jalankan / a / helloworld. Setelah skrip shell keluar, direktori saat ini kembali ke / b.
Berikut contoh skrip bash shell:
sumber
mengapa tidak menjaganya tetap sederhana
cd SOME_PATH && run_some_command && cd -
perintah 'cd' terakhir akan membawa Anda kembali ke direktori pwd terakhir. Ini harus bekerja pada semua sistem * nix.
sumber
run_some_command
gagal,cd -
tidak akan dieksekusi.Jika Anda selalu ingin ke / C, gunakan jalur absolut saat Anda menulis file.
sumber
Jika Anda ingin melakukan ini di dalam program Anda maka saya akan melakukan sesuatu seperti:
sumber
dari direktori saat ini, berikan path lengkap ke direktori script untuk menjalankan perintah
sumber