Pertanyaan Membuat skrip bash pertama saya, tidak bisa mendapatkan perintah cd untuk 'stick.' [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Untuk skrip bash pertama saya, saya ingin membuat sesuatu yang benar-benar mengganggu saya: ketika saya beralih folder, saya ingin isi folder itu dipindahkan secara otomatis. Saya mencoba menambahkan kode berikut ini ke ~ / .bashrc:

alias go='cd; ls'

Cukup sederhana saya pikir! Tidak begitu. Saat mengetik go /etc memang daftar isi / etc, direktori kerja saya belum benar-benar berubah, saya masih dalam yang saya sebelumnya. Bagaimana saya mengatasi ini?


11
2017-08-11 19:02


asal




Jawaban:


Dalam contoh Anda, go /etc akan melakukan cd; ls /etc. Itu artinya, pertama, cd akan mengubah direktori saat ini ke direktori home Anda. Kemudian, ls /etc akan menampilkan isi /etc.

Anda dapat mencapai apa yang Anda inginkan dengan mendefinisikan fungsi, seperti:

function go() {
    cd "$1" && ls
}

Atau ketikkan saja di baris perintah pada satu baris:

function go() { cd "$1" && ls; }

Kemudian go /etc akan melakukan apa yang kamu inginkan.

$1 mengacu pada parameter pertama yang diteruskan ke perintah dalam contoh ini /etc. Anda bisa merujuk ke parameter berikutnya dengan $2, $3 dan seterusnya.


29
2017-08-11 19:09



+1. Satu peningkatan: hanya mengeksekusi ls jika cd berhasil: go() { cd "$1" && ls; } - ini menghindari daftar direktori saat ini jika parameter tidak ada. - glenn jackman
Ini sepertinya sudah berhasil. Meskipun tidak terlihat rumit secara relatif, ternyata itu masih sedikit lebih rumit dari yang saya maksudkan semula. Satu pertanyaan singkat, meskipun: bagaimana cara kerja "$ 1"? - Ram
@ user3471004 - $1 Argumen pertama diteruskan ke perintah - ini juga diikuti $2 untuk kedua, $3 untuk yang ketiga, dll. $@ juga dapat digunakan untuk mewakili semua argumen. Berbagai contoh dapat ditemukan - mis ini. - Wilf


Anda mungkin ingin menggabungkan ini dengan built-in bash directory stack (dirs). ini akan memberi Anda kesempatan untuk mengetik: go ..., untuk melihat folder sebelumnya dalam tumpukan Anda, lalu ketik nama mereka. misal:

function go() { 
 if [ "$1" == "..." ]; then popd >/dev/null ; else pushd "$1" >/dev/null ; fi
 ls $@
}

Anda dapat mengganti ... dengan kata kunci lain, seperti _back. sesuatu yang tidak akan menjadi nama direktori.

Anda akan melihat ls $@ yang berarti semua parameter yang tersisa akan diteruskan ke ls. jadi jika Anda ingin pergi dan memiliki daftar panjang, atau membalik daftar waktu, gunakan: go /var -l atau go /etc -ltr


-1
2017-08-12 08:31



Karena Anda tidak menghapus $1 dari $@ itu akan tetap menjadi argumen pertama untuk ls $@. Dalam banyak kasus, ini akan menyebabkan kesalahan saat menggunakan jalur relatif. - Adaephon
Tidak terlalu relevan dengan pertanyaan itu. - moopet
Itu $@ harus dikutip jika salah satu istilah asli mengandung spasi. Maka itu seharusnya ls "$@" (atau dengan praktik terbaik ls "${@}"). - Paddy Landau