Saya hanya ingin menulis skrip yang mengubah direktori saya .
Saya menaruh perintah di bawah ini dalam file /home/alex/pathABC
#!/bin/sh
cd /home/alex/Documents/A/B/C
echo HelloWorld
Saya lakukan chmod +x pathABC
.
Di terminal, sementara di /home/alex
, saya jalankan ./pathABC
, tetapi hasilnya adil HelloWorld
dan direktori saat ini tidak berubah.
Jadi apa yang salah?
command-line
scripts
gnome-terminal
Mohammad Reza Rezwani
sumber
sumber
Jawaban:
Seperti yang telah dijelaskan orang lain, direktori diubah dalam proses anak skrip Anda, bukan dalam proses terminal dari mana skrip dipanggil. Setelah proses anak meninggal, Anda kembali ke terminal yang tersisa di tempatnya.
Beberapa alternatif:
1. Tautan simbolik
Letakkan symlink di rumah Anda ke jalur panjang yang ingin Anda akses dengan mudah
lalu akses direktori dengan:
2. Alias
Masukkan alias di ~ / .bashrc Anda:
(dari sini )
3. Fungsi
Buat fungsi yang mengubah direktori, fungsi berjalan dalam proses terminal Anda dan kemudian dapat mengubah direktori-nya.
(dari sini )
4. Hindari berlari saat kecil
Sumber skrip Anda alih-alih menjalankannya. Sourcing (dilakukan oleh
.
atausource
) menyebabkan skrip dieksekusi di shell yang sama dan bukannya dijalankan di subkulitnya sendiri.(dari sini dan sini )
5. vars yang dapat di-cd
Setel
cdable_vars
opsi di Anda~/.bashrc
dan buat variabel lingkungan ke direktori:Maka Anda bisa menggunakannya
cd pathABC
(dari sini )
sumber
source
! Saya selalu bertanya-tanya mengapa saya lakukansource .bashrc
dan tidakbash .bashrc
cd $pathABC
?Saat Anda menjalankan skrip di terminal, proses anak berjalan. Dalam program anak ini, skrip Anda akan berubah ke direktori apa pun yang ditentukan. Tetapi dalam proses induk yaitu di mana Anda menjalankan skrip masih di jalur lama. ATAU sederhananya kita dapat mengatakan:
The scope of cd command is only for child process not parent
sumber
. pathABC
atausource pathABC
.Anda membuat kesalahan berpikir. Sementara shell saat ini tetap berada di direktori yang sama, skrip telah pindah ke direktori baru.
Anda bisa melihatnya dengan membuat skrip lain di direktori baru , dan menjalankannya dari skrip Anda, setelah itu mengubah direktori:
Script kedua akan dijalankan dari direktori baru.
hanyalah output dari skrip.
sumber
pwd
di direktori baru, daripada menambahkan skrip baru ke dalam situasi.Karena hello world hanyalah pernyataan jejak, mari kita coba ini:
Buat file skrip bash yang
cd.sh
berisi:.sh
ekstensi konvensi yang lebih tua memberikan bash script nama file ekstensi. Ini murni kosmetik dan biasanya tidak perlu. Namun dalam hal ini penting untuk membedakan daricd
perintah inti .Tandai file skrip bash yang dapat dieksekusi menggunakan:
Sekarang jalankan file:
cd
kita semua tahu.$(...)
mengeksekusi perintah di dalam tanda kurung dan mengembalikan output.cd.sh
berada di jalur Anda, Anda tidak perlu menentukan di mana itu. Kami awali dengan./
untuk menentukan perintah di direktori saat ini.echo
output daricd.sh
naskah dikirim kembali ke orangtua melalui$(...)
. Induk (prompt shell kami) menggunakan output ini dan meneruskannya kecd
perintah Linux .Seperti yang disebutkan orang lain, proses anak tidak dapat mengubah direktori induk. Ini adalah salah satu cara anak dapat memberi tahu orang tua ke mana harus pergi setelah proses berakhir.
sumber
14.04
versi Anda yang saya baca sekitar satu jam yang lalu?cd /home/mike/Documents/A/B/C
yang tidak menghasilkan output apa pun. Sekarangecho "/home/mike/Documents/A/B/C"
, yang menghasilkan output../cd.sh
itu sekarangcd $(./cd.sh)
tapi itu mencapai tujuan anak mengubah direktori saat ini orang tua. Ya itu tidak konvensional tapi itu cara lain untuk melakukannya yang saya harap orang-orang temukan menarik.