Bayangkan saya memiliki jalan yang tidak ada:
$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory
Tapi katakanlah /foo/bar
memang ada. Apakah ada cara cepat bagi saya untuk menentukan itu baz
adalah titik putusnya di jalan?
Saya menggunakan Bash.
access(2)
tidak terlalu granular, jadi solusinya biasanya melibatkan menulis sesuatu untuk beralih dan menguji setiap elemen path pada gilirannya ...Jawaban:
Diberi nama path kanonik, seperti milik Anda, ini akan berfungsi:
Itu mencetak melalui komponen terakhir yang sepenuhnya tersedia / diakses
$pathname
, dan menempatkan masing-masing secara terpisah ke dalam array arg. Komponen pertama yang tidak ada tidak dicetak, tetapi disimpan di$p
.Anda mungkin mendekatinya secara berlawanan:
Itu akan kembali dengan tepat atau akan pare
$path
sesuai kebutuhan. Itu menolak untuk mencoba perubahan/
, tetapi jika berhasil akan mencetak direktori kerja Anda saat ini dan direktori yang diubahnya menjadi stdout. Saat ini Anda$PWD
akan dimasukkan ke dalam$OLDPWD
juga.sumber
for p in $pathname
akan dikenakan "pemisahan kata" dan "Perluasan jalur".$IFS
. itulah cara kerjanya. itu tidak tunduk pada ekspansi pathname, kecuali bahwa variabel di sini dipanggil$pathname
diperluas ke array komponen path sebagai split on$IFS
.$pathname
dengan menggunakanset -f
"yang tidak dikembalikan ke nilai default.ns
, yang, jika digunakan di sini, akan membuat diskusi ini diperdebatkan.Salah satu utilies favorit saya adalah
namei
, bagian dariutil-linux
dan karenanya umumnya hanya ada di Linux:Tetapi hasilnya tidak terlalu dapat diuraikan. Jadi, jika Anda hanya ingin menunjukkan ada sesuatu yang hilang,
namei
mungkin berguna.Ini berguna untuk memecahkan masalah umum dalam mengakses jalur, karena Anda bisa membuatnya untuk menyatakan apakah suatu komponen adalah tautan atau titik pemasangan, serta izinnya:
Ibu kota
D
menunjukkan titik pemasangan.sumber
namei
bekerja untuk saya selama memberi makan jalan yang ada, tetapi ketika saya memberikannya yang tidak saya dapatkannamei: failed to stat: /usr/share/foo/bar: No such file or directory
.Sesuatu seperti ini (akuntansi untuk nama path dengan embedded kosong):
sumber
cd not_a_directory
shell Anda akan menulis ke stderr sesuatu seperticd:cd:6: no such file or directory: not_a_directory
. Sebenarnya, shell pengguna akan melakukannya dalam format yang dengannya pengguna mungkin sudah sangat akrab. Ini hampir selalu lebih mudah dan lebih baik pada akhirnya untuk melakukan hal - hal dan membiarkan shell menangani pelaporan sebagaimana diperlukan. Filosofi semacam itu memang membutuhkan perhatian yang sangat ketat untuk mengembalikan nilai dan promosi / pelestarian yang sama.Hanya solusi alternatif untuk bash, dengan asumsi path adalah path absolut (dimulai dengan /):
sumber
pa
sebagaipa_prev
baris pertama dari while loop (sebelum bertambah). Ketika tes untuk "pa" kemudian gagal,pa_prev
memiliki direktori terakhir yang ada di jalur yang diberikan.itu tidak sederhana tetapi Anda dapat meletakkannya di skrip, membuatnya dapat dieksekusi dan menempelkannya di suatu tempat di jalur Anda, jika Anda akan sering menggunakannya.
Caveat emptor: Jika nama direktori Anda di tingkat mana pun mengandung
space
karakter, ini TIDAK akan berfungsi.sumber