Menulis skrip pertama saya jadi saya yakin ini adalah pertanyaan dasar, tetapi bisakah seseorang tolong jelaskan kepada saya mengapa saya bisa:
cd ~
cd bin
cd ~/bin
cd 'bin'
Tapi tidak
cd '~'
cd '~/bin'
Saya perlu ke cd
jalur direktori dengan spasi di salah satu nama direktori, jadi saya perlu tanda kutip (ini Windows di Program Files
bawah anggur). Saya bisa mengatasinya dengan dua cd
perintah, tetapi mengapa saya tidak bisa memberi ~
tanda kutip?
Jika saya mengetik cd '~'
(atau cd "~"
) saya mendapatkan:
bash: cd: ~: No such file or directory
command-line
bash
B.Tanner
sumber
sumber
cd
masuk ke direktori bernama~
?cd
. Gunakan variabel untuk menyimpan nama path yang tidak ingin Anda ketikkan beberapa kali, misalnyapf=~/.wine/drive_c/Program\ Files/; cp /path/to/file "$pf"
/
atauNUL
?cd ./~
Jawaban:
Seperti yang dicatat @karel dalam jawabannya,
~
adalah karakter khusus dan diperluas oleh Bash ke direktori home pengguna saat ini. Lihat manual Bash pada "Ekspansi Tilde" , atau cari judul "Ekspansi Tilde" di halaman manual (man bash
).Setiap jenis kutipan di sekitar
~
mencegah ekspansi tilde ini.Untuk menjawab pertanyaan Anda tentang bagaimana Anda masih bisa menggunakannya
cd
ke direktori dengan spasi di namanya, ada beberapa alternatif:Hilangkan tanda kutip dan hindari spasi dengan garis miring terbalik sebagai gantinya:
Mengutip sisa dari jalan, tetapi hilangkan mereka di sekitar tilde dan garis miring pertama:
Seperti yang Anda lihat, Anda dapat menggabungkan string yang dikutip dan tidak dikutip di Bash dengan hanya menulisnya berdampingan tanpa spasi di antaranya.
Gunakan variabel lingkungan
$HOME
alih-alih tilde, yang masih diperluas dalam "tanda kutip ganda" (tapi bukan 'tanda kutip tunggal'):sumber
~'/...'
tidak akan berfungsi dan tidak sesuai dengan jawaban ini.~/'...'
atau~/"..."
akan bekerja.~/'path'
adalah cara untuk pergi.~'/...'
berhasil? Garis miring bukanlah karakter khusus sehingga sepertinya harus bekerja di dalam atau di luar tanda kutip.~ adalah karakter khusus yang diartikan oleh shell sebagai direktori home pengguna yang login. '~' ditafsirkan oleh shell sebagai karakter ~ literal, bukan sebagai direktori home pengguna yang login karena melampirkan string di dalam dua karakter kutipan tunggal menghasilkan string diinterpretasikan sebagai string teks literal.
sumber
~
bukan alias dalam artibash
menafsirkannya: Alias memungkinkan string untuk diganti dengan kata ketika digunakan sebagai kata pertama dari perintah sederhana. . Seperti yang saya jelaskan dalam jawaban saya di bawah, ini agak ekspansi.Ini adalah
bash
fitur yang disebut Ekspansi Tilde . Mengutipman bash
:Agar ekspansi berfungsi, karakter tilde
~
perlu dikuotasi, jika karakter tersebut diambil secara harfiah dancd
gagal jika tidak ada direktori bernama~
present di direktori saat ini. Lihat jawaban yang menarik ini untuk penjelasan tentang cara mengutipbash
. Jika Anda perlu mengutip bagian dari jalur, Anda dapat:kutip setidaknya karakter yang perlu kutip dengan kutip tunggal, mis
atau
kutip setidaknya karakter yang perlu kutip dengan kutip ganda, mis
atau
hanya mengutip karakter yang perlu kutip dengan garis miring terbalik, mis
Tilde Expansion memiliki beberapa fitur yang lebih menarik, misalnya:
~+
memperluas ke nilaiPWD
, yaitu direktori kerja saat ini~-
memperluas ke nilaiOLDPWD
, yaitu direktori kerja sebelumnya~john
memperluas ke direktori home yang terkait dengan nama login "john"sumber
$ touch a; cd \a
,. (Saya pikir ini mungkin akan bermasalahcd \n
, tetapi percobaan setidaknya pada versi sayabash
menunjukkan itu berfungsi dengan baik.)Jelajahi menggunakan
echo
perintahCara termudah untuk mengeksplorasi cara kerja bash adalah dengan
echo
perintah. Dalam hal~
penggunaan ini:Seperti yang Anda lihat, ketika Anda mengutip tunggal atau menggunakan tanda kutip ganda di
~
sekitarnya ditafsirkan secara harfiah sebagai string dan tidak diperluas sebagai variabel. Ketika Anda menggunakan backticks (`) dieksekusi sebagai perintah dan menghasilkan pesan kesalahan.sumber