Saya mencoba menggunakan perintah curl untuk mengakses url http dengan tanda seru ( !
) di jalurnya. misalnya:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
balasan konsol dengan bash: ... event not found
.
Apa yang terjadi disini? dan apa yang akan menjadi sintaksis yang tepat untuk menghindari tanda seru?
bash
quoting
special-characters
netbrain
sumber
sumber
Jawaban:
Tanda seru adalah bagian dari ekspansi sejarah di bash. Untuk menggunakannya Anda perlu menyertakannya dalam tanda kutip tunggal (misalnya:)
'http://example.org/!132'
atau untuk melarikan diri secara langsung dengan tanda garis miring terbalik (\
) sebelum karakter (misalnya:)"http://example.org/\!132"
.Perhatikan bahwa dalam tanda kutip ganda, garis miring terbalik sebelum tanda seru mencegah ekspansi riwayat, TETAPI garis miring terbalik tidak dihilangkan dalam kasus seperti itu. Jadi lebih baik menggunakan tanda kutip tunggal, jadi Anda tidak melewatkan backslash literal
curl
sebagai bagian dari URL.sumber
"http://example.org/\!132"
sebenarnya mengembang tanpa menginterpretasikan backslash (alasan kepatuhan POSIX, saya percaya).\!
dan mengutip dua kali lipat.|
dan digunakan untuk membuat pipa. Jika Anda mengirim skrip ke pelanggan dan tidak yakin di mana mereka akan menjalankannya, Anda harus menguji semuanya!Selain jawaban yang diberikan oleh Daniel, Anda juga dapat mematikan ekspansi sejarah jika Anda tidak menggunakannya
set +H
.sumber
Ctrl-R
) yang memungkinkan Anda melihat pratinjau & mengedit perintah Anda sehingga Anda tidak membabi buta dengan perintah!-14
yang Anda!-12
pikir sebelumnya, oops, kebetulan terjadirm -rf *
. Berhati-hatilah. Nonaktifkan ekspansi riwayat! Hindari!
!fc -14
. Tetapi memang benar bahwa Anda dapat melakukan itu tanpa ekspansi sejarah diaktifkan juga. Secara pribadi, saya menggunakan!$
dan!vi
dansudo !!
dan bahkangit add !vi:$
cukup sering untuk menjamin membiarkan ekspansi sejarah diaktifkan.Saya pribadi akan melakukan tanda kutip tunggal, tetapi untuk kelengkapan, saya juga akan mencatat karena ini adalah URL, Anda dapat menyandikan
!
sebagai%21
, misalnyacurl -v http://example.org/%21132
.sumber
Ini juga bisa dilakukan
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
atau
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Yang bekerja karena bash menggabungkan string yang berdekatan. Pendekatan ini sangat berguna ketika Anda memiliki hal-hal lain yang membutuhkan ekspansi shell, jadi Anda tidak dapat menggunakan tanda kutip tunggal untuk seluruh string:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
karakter digunakan untuk ekspansi sejarah di command line prompt.jadi ini bisa menjadi masalah pada prompt tetapi tidak pada file skrip shell.
seperti yang Anda lihat ekspansi sejarah bekerja bahkan dalam tanda kutip ganda.
sumber
Saya telah menemukan masalah yang sama, dan solusi sederhana saya adalah menggunakan variabel:
Di sini kesederhanaannya adalah bahwa (1) Ia portabel di seluruh cangkang dan perintah (2) Tidak perlu mengetahui sintaks escape dan kode ASCII.
sumber
Sejak Bash 4.3, sekarang Anda dapat menggunakan tanda kutip ganda untuk mengutip karakter ekspansi sejarah:
sumber
echo
, gema tampaknya menangani ini sendiribash
Versi Anda tidak ada hubungannya dengan bang yang tidak diperluas, itu disebabkan oleh fakta bahwa dalam contoh Anda!
diikuti oleh "end of line" dan yang mencegah shell dari mencoba untuk memperluasnya. Cobaecho "!Hello World"
dan Anda akan melihat yangbash
akan membalasbash: !Hello: event not found
. Lihat manual untuk detail lebih lanjutBagi mereka yang menggunakan git bash di windows, jawaban yang diterima dari @DanielPittman berfungsi. Namun, Anda harus mengganti garis miring terbalik (\) dengan garis miring maju (/).
Misalnya, di unix, akan terlihat seperti ini:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Untuk windows, ini akan menjadi seperti ini (fokus pada garis miring di bagian header otorisasi)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
sumber