Mengapa perintah mkdir gagal dengan: "Tidak ada file atau direktori"?
#!/bin/bash
set -e
BIN_DIR="~/bin/"
if [ ! -d "$BIN_DIR" ]; then
mkdir "$BIN_DIR"
fi
command-line
bash
scripts
home-directory
mkdir
Hendré
sumber
sumber
Jawaban:
Pesan kesalahan dihasilkan karena tilde
~
dikutip, seperti yang dijelaskan dalam jawaban Zanna . Jika Anda ingin menggunakan~
, bagian skrip yang relevan adalah:Jika karena alasan apa pun Anda ingin mengutip string, Anda dapat menggunakan variabel lingkungan
$HOME
:Menurut saya pendekatan kedua adalah praktik yang lebih baik.
sumber
~
skrip. ini bekerja dengan cara yang persis sama seperti pada baris perintah. Masalahnya adalah bahwa mengutip memblokir ekspansi tilde seperti yang dijelaskan dalam jawaban Zanna .$HOME
skrip adalah ide yang bagus.$HOME
daripada menggunakan ekspansi tilde? Satu-satunya penjelasan yang Anda berikan adalah mengatakan, "itu adalah ide yang lebih baik, karena Anda harus kurang memperhatikan." Saya tidak tahu apa artinya itu. Bisakah Anda menjelaskannya secara sunting? Tanpanya, tidak ada yang mendukung jawaban Anda, jadi sudah pasti jawabannya. Perluasan Tilde telah dibutuhkan oleh POSIX untuk beberapa saat sekarang dan baris hashbang script#!/bin/bash
jadi saya kira portabilitas bukan alasannya.Tidak berfungsi karena
~
dikutip. Kutipan ganda"
menekan ekspansi tilde . Tidak ada direktori dengan nama literal~/bin
. Seperti yang dijelaskan dalamman bash
(penekanan saya):Anda dapat menghapus tanda kutip , karena
~
hanya karakter di jalur~/bin
yang akan menyebabkan shell melakukan ekspansi, dan kami ingin ekspansi dalam kasus ini. Shell tidak akan melakukan apa pun perluasan lebih lanjut pada hasil ekspansi tilde, setidaknya di Bash 4 , yang semua rilis saat ini atau jarak jauh terbaru dari Ubuntu memiliki . Jadi, bahkan jika direktori home Anda mengandung karakter yang tidak biasa seperti spasi, tidak apa-apa.Atau Anda dapat menggunakan
$HOME
bukan dari~
, karena ekspansi parameter tidak ditekan oleh tanda kutip ganda, hanya dengan tanda kutip tunggal . Tanda kutip ganda jangan memastikan bahwa nilai diperluas tidak sendiri tunduk pada perluasan lebih lanjut, sehingga kata membelah atau ekspansi nama file tidak akan terjadi. Jadi,$HOME
bekerja bahkan dengan direktori home dengan nama aneh juga, asalkan Anda menyimpan tanda kutip ganda.sumber
cd '~'
adalah-bash: cd: ~: No such file or directory
.~
bukan bagian dari ekspansi parameter.