Bash menggunakan tanda seru untuk ekspansi sejarah, seperti yang dijelaskan dalam jawaban untuk pertanyaan ini (misalnya sudo !!
menjalankan baris perintah sebelumnya dengan sudo
). Namun, saya tidak dapat menemukan tempat yang menjelaskan apa yang menjalankan perintah berikut (yaitu tanda seru tunggal):
!
Tampaknya tidak mencetak apa pun dan keluar dengan 1, tetapi saya tidak yakin mengapa ia melakukan itu. Saya telah melihat online dan di halaman manual Bash, tetapi tidak dapat menemukan apa pun, terlepas dari kenyataan bahwa itu adalah "kata yang dilindungi" - tetapi begitu juga }
, dan menjalankan ini:
}
mencetak kesalahan:
bash: syntax error near unexpected token `}'
!
menunjukkan "awal" dari ekspresi ekspansi sejarah.Jawaban:
Satu-satunya
!
di awal perintah meniadakan status keluar dari perintah atau pipa : jika perintah keluar0
, itu akan berubah menjadi1
(kegagalan), dan jika keluar non-nol itu akan mengubahnya menjadi0
keluar (berhasil).Penggunaan ini didokumentasikan dalam manual Bash:
Sebuah
!
tanpa perintah berikut meniadakan perintah kosong, yang tidak apa-apa dan kembali benar (setara dengan para:
perintah ). Dengan demikian itu membalikkan yang benar ke yang salah dan keluar dengan status 1, tetapi tidak menghasilkan kesalahan.Ada juga kegunaan lain dari
!
dalamtest
dan[[
perintah, di mana mereka meniadakan tes kondisional. Ini tidak terkait dengan apa yang Anda lihat. Baik dalam pertanyaan Anda dan kasus-kasus itu tidak terkait dengan ekspansi sejarah dan!
dipisahkan dari istilah lain.sumber
Anda dapat menemukan satu tanda seru yang didokumentasikan di bagian manual bash 3.2.2 Pipa
Juga bagian 3.2.4.2 Konstruksi Bersyarat
Juga bagian 4.1 Bourne Shell Builtins
Juga harus dicatat bahwa
!
akan memulai penggantian sejarah kecuali diikuti oleh: spasi, tab, akhir baris, '=' atau '(' (ketika opsi cangkang extglob diaktifkan menggunakan shopt builtin).sumber
Karena
!
digunakan dalam perbandingan dan artinya TIDAK .Sebagai contoh:
sumber
!
sebagai argumen padatest
perintah (termasuk versi built-in bash), bukan arti!
ketika digunakan dalam posisi perintah.! [...]
mencocokkan pertanyaan dalam kasus ini.[]
adalahtest
. Saya sedikit terburu-buru.!
built-in command, membalikkan arti pipa.Penggunaan lainnya:
#!
built-in command, memanggil interpreter bernama untuk menjalankan skrip.!
penunjuk acara, menandai kata baris perintah sebagai pengganti sejarah!=
operator ketidaksetaraan$!
variabel shell, mengembalikan nomor proses dari perintah latar belakang terakhir.sumber
ls -l /tmp
cd !$
ini : Ini akan membawa Anda ke direktori / tmp.! diikuti oleh sebuah string mengeksekusi perintah sebelumnya yang terbaru (masih dalam buffer perintah) yang dimulai dengan string yang diberikan. Mungkin shell hanya menemukan bahwa tidak ada perintah sebelumnya dimulai dengan <null>.
sumber