Saya ingin menulis beberapa kode untuk memungkinkan saya beralih ke beberapa direktori yang biasanya saya kunjungi. Katakanlah program ini mycd
, dan /a/very/long/path/name
merupakan direktori yang ingin saya kunjungi.
Jadi saya cukup mengetik mycd 2
saja cd /a/very/long/path/name
. Di sini saya menganggap mycd
tahu 2
mengacu pada itu /a/very/long/path/name
. Mungkin juga ada mycd 1
, mycd 3
... dll
Masalahnya adalah saya harus menulis mycd
sebagai skrip shell dan mengetik . mycd 2
untuk melakukan hal yang diinginkan karena jika skrip hanya dieksekusi dalam skrip anak yang tidak mengubah apa pun tentang shell induk yang benar-benar saya pedulikan.
Pertanyaanku adalah:
dapatkah saya melakukannya tanpa menggunakan
source
? karena. mycd
menganggapmycd
harus menjadi skrip shell dan ini mungkin juga memperkenalkan beberapa fungsi yang tidak saya inginkan.dapatkah saya menerapkannya dalam beberapa bahasa pemrograman lain?
sumber
mycd
lulus$@
ke program apa pun yang saya suka."$@"
sehingga setiap argumen yang mengandung spasi putih ditangani dengan benar.Anda tidak dapat mengubah direktori shell saat ini dari proses lain. Hanya proses itu sendiri yang dapat mengubah direktori saat ini. Ini juga berlaku untuk beberapa karakteristik lain seperti variabel lingkungan dan deskriptor file.
Sebenarnya mungkin untuk memengaruhi direktori proses saat ini dengan membuatnya menjalankan
chdir
panggilan sistem melaluiptrace
panggilan sistem, yang memungkinkan debuggers bekerja. Namun, jika proses mempertahankan beberapa struktur data internal yang harus konsisten dengan direktori aktual saat ini, program cenderung macet. Sebagai penutup, pendekatan ini tidak memiliki kesempatan untuk bekerja.Anda perlu mengatur agar kode Anda dieksekusi oleh shell itu sendiri. Cara normal untuk melanjutkan adalah dengan membuatnya menjadi fungsi shell dan menyimpannya di
~/.bashrc
. Jika ini tidak memungkinkan, misalnya karena itu kode yang ingin Anda distribusikan, tulis file sumber shell yang berisi definisi fungsi, dan beri tahu orang-orang agar shell interaktif mereka membaca file Anda dengan.
perintah .sumber
ws=$1; gdb -p $(ps h -o ppid -p $$) -ex "call chdir(\"$wd\")" -ex "call set_working_directory(\"$wd\")" -ex detach -ex q -batch
. Jalankan sebagaibraindead-cd-parent /
. Anda akan melihat bahwapwd
pengembalian/
danls
perilaku, dll. Tetapi prompt (PS1
) masih tidak berubah, mata orang terluka, dll. Jadi jangan lakukan ini bahkan jika itu mungkin.ptrace
metode yang saya sebutkan. Ini bekerja dengan baik pada program yang tidak terlalu peduli dengan direktori mereka saat ini. Dalam sebuah shell, banyak hal (PWD
variabel, prompt, dll.) Akan menjadi salah, dan shell mungkin macet atau perilaku buruk.Seperti yang Anda tunjukkan sendiri, skrip shell selalu dijalankan dalam subkulit, yang tidak dapat memengaruhi shell induknya.
Namun Anda dapat ...
alias mycd2='cd /a/very/long/path/name'
minta script 1 Anda menampilkan perintah shell yang valid ...
... dan jalankan outputnya:
$(mycd 2)
1: Anda mungkin ingin menggunakan
case
pernyataan daripadaif
kondisi dalam contoh.sumber