Apa maksud backslash dot sebagai perintah?


17

Perangkat lunak yang saya instal menyisipkan baris di profil saya yang bertuliskan:

[ -s "$SOME_FILE" ] && \. "$SOME_FILE"

Saya tahu dot .identik dengan source, jadi saya curiga ini hanya sumber file, tapi saya belum pernah melihat \.sebelumnya; apakah itu melakukan sesuatu yang lain?

Edit, terkait DV: mencari "backslash dot" mengarah ke pertanyaan terkait ./saat memanggil file yang dapat dieksekusi, dan man sourcemengarah ke halaman manual di mana \.tidak muncul. Saya tidak tahu harus mencoba apa lagi, karena itu pertanyaannya.

Sunting 2: lihat pertanyaan terkait

Jawaban:


31

Garis miring terbalik di luar tanda kutip berarti "menafsirkan karakter berikutnya secara harfiah selama penguraian". Karena .merupakan karakter biasa untuk parser, \.diuraikan dengan cara yang sama dengan ., dan memanggil builtin .(yang sourcemerupakan sinonim dalam bash).

Ada satu kasus di mana itu bisa membuat perbedaan dalam konteks ini. Jika pengguna telah menetapkan alias yang dipanggil .sebelumnya .profile, dan .profilesedang dibaca di shell yang memperluas alias (yang bash hanya secara default ketika dipanggil secara interaktif), maka .akan memicu alias, tetapi \.masih akan memicu builtin, karena shell tidak mencoba alias memperluas kata-kata yang dikutip dengan cara apa pun.

Saya menduga .itu diubah menjadi \.karena pengguna mengeluh setelah mereka membuat alias untuk ..

Catatan yang \.akan memanggil fungsi yang disebut .. Agaknya pengguna yang menulis fungsi lebih berpengetahuan daripada pengguna yang menulis alias dan akan tahu bahwa mendefinisikan ulang perintah standar .profileadalah ide yang buruk jika Anda akan memasukkan kode dari pihak ketiga. Tetapi jika Anda ingin mem-byp kedua alias dan fungsi, Anda bisa menulis command .. Penulis potongan ini juga tidak melakukan ini karena mereka peduli dengan kerang antik yang tidak memiliki commandbuiltin, atau lebih mungkin karena mereka tidak menyadarinya.

Omong-omong, mendefinisikan alias apa pun di dalam .profileadalah ide yang buruk karena .profilemerupakan skrip inisialisasi sesi , bukan skrip inisialisasi shell . Alias ​​untuk bash termasuk dalam .bashrc.


9

Ini \.adalah "titik literal", yaitu hanya sebuah titik. Ini akan diambil sebagai .perintah standar (mirip dengan sourcein bash).

Standar POSIX mengatakan ini tentang ini (penekanan saya)

A <backslash>yang tidak dikutip harus mempertahankan nilai literal dari karakter berikut , dengan pengecualian a <newline>. Jika a <newline>mengikuti <backslash>, shell harus menafsirkan ini sebagai kelanjutan garis. The <backslash>dan <newline>harus dihapus sebelum membelah masukan ke token . Karena lolos <newline>sepenuhnya dihapus dari input dan tidak diganti oleh spasi putih, itu tidak bisa berfungsi sebagai pemisah token.

Karakter titik dapat alias:

$ alias .='echo hello'
$ .
hello

yang berarti bahwa \.akan menghindari menggunakan versi alias dari .perintah, karena ,

Setelah token dibatasi, tetapi sebelum menerapkan aturan tata bahasa di Shell Grammar, kata yang dihasilkan yang diidentifikasi sebagai kata nama perintah dari perintah sederhana harus diperiksa untuk menentukan apakah itu nama alias yang tidak dikutip , valid atau tidak.


Saya sedang mencari sumber resmi tentang bagaimana backslash dalam sebuah kata diartikan sebagai mengutip, dan bagaimana ini mencegah ekspansi alias. Terima kasih untuk referensi!
Sheljohn

1
@ Sheljohn Lihat jawaban yang diperbarui.
Kusalananda
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.