Saya menemukan skrip shell ini ($ 1, $ 2 adalah direktori): MV "$ 2" "$ 1" || Keluar # Hasilkan $ 2 Subdirektori $ 1 CD "$ 1 / $ (Basename" $ 2 ")" || keluar # ...

0
newhere 5 April 2021, 19:36

2 jawaban

Jawaban Terbaik

basename menghapus informasi direktori terkemuka. Asumsikan bahwa skrip disebut dengan argumen seperti ini:

$$> script usr/local/foo usr/local/bar

Sekarang $2 sama dengan usr/local/bar.

Jika Anda hanya melakukan cd $1/$2, perintah akan terlihat seperti ini:

cd usr/local/foo/usr/local/bar

Tetapi pada kenyataannya, seharusnya

cd usr/local/foo/bar

Ini menghapus awalan direktori ini dari usr/local/bar adalah whhat dilakukan dengan basename.

https://www.geeksforgeeks.org/basename-command-in-linux-with-examples/

1
Charlie 5 April 2021, 16:48

Juga $ 2 perlu dalam kutipan terpisah ("$ 2") karena Basename?

Ya, ada set ekspansi outer "$1/$(...)", dan ekspansi batin "$2" yang harus dikutip untuk mencegah masalah dengan kata pemisahan yang akan mematahkan perintah jika $2 berisi spasi putih (atau shell glob karakter).

Lihat mis. mengutip dalam $ (substitusi perintah) di Bash di Unix.se untuk detailnya.

(Sebenarnya itu harus cd -- "$1/$(basename -- "$2")" untuk menjaga dari nama file / jalur yang dimulai dengan - juga.)

0
ilkkachu 5 April 2021, 17:41