Anda dapat menggunakan cat
dengan -A
opsi:dari manual:
-A, --show-all
equivalent to -vET
-E, --show-ends
display $ at end of each line
-T, --show-tabs
display TAB characters as ^I
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
Jadi cat -A yourscrip.sh
akan menunjukkan kepada Anda karakter yang tidak terlihat dan aneh.
Salah satu opsinya adalah melihat karakter yang Anda coba gunakan dengan hex viewer atau editor. hexdump
adalah opsi yang bagus jika Anda terbatas pada terminal.
$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000 5b 20 2d 66 20 2f 65 74 63 2f 6f 70 65 6e 76 70 |[ -f /etc/openvp|
00000010 6e 2f 63 6c 69 65 6e 74 2e 63 6f 6e 66 20 5d 20 |n/client.conf ] |
00000020 26 26 20 65 63 68 6f 20 74 72 75 65 0a |&& echo true.|
0000002d
Anda dapat melihat di sini bahwa space
, close-square-brace
, space
sudah benar - 0x20
, 0x5D
, 0x20
.
Nilai-nilai ini adalah kode ASCII, ditampilkan dalam heksadesimal. Nilai apa pun di luar rentang 0x20
- 0x7E
bukan "karakter yang dapat dicetak " sejauh menyangkut ASCII, dan kemungkinan besar tidak akan bekerja dengan baik dengan antarmuka baris perintah.
Catatan: Saya menyalin "rusak pertama Anda " untuk digunakan dalam hexdump
contoh di atas, jadi ada sesuatu yang menggantikan not-an-ASCII-space dengan spasi ASCII antara sumber asli dan pertanyaan yang Anda berikan.
Untuk mengulanginya, lakukan langkah-langkah berikut:
- Ketik
hexdump -Cv <<"EOF"
dan tekan Enter - Tempelkan teks yang ingin Anda gunakan
- Ketik
EOF
pada barisnya sendiri, dan tekan Enter
Terminal dan Antarmuka Baris Perintah tidak menangani karakter khusus dengan baik - seperti yang telah Anda temukan. Jika Anda tidak terlalu berhati-hati dalam memformat dokumen, Anda juga akan mengalami masalah dengan Microsoft Word (dan lainnya) menggunakan "kutipan cerdas ", em-dash, daftarnya terus berlanjut...
Temukan perbedaannya:(bagian atas adalah "kutipan cerdas ", bagian bawahnya adalah "tanda kutip langsung ")
$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000 e2 80 9c 71 75 6f 74 65 64 20 73 74 72 69 6e 67 |...quoted string|
00000010 e2 80 9d 0a |....|
00000014
Di sini, kutipan terbuka bukanlah kutipan ASCII sederhana ("
), tetapi merupakan seri Unicode / UTF-8 - 0xE2
, 0x80
, 0x9C
, atau U+201C
- yang tidak akan ditangani oleh terminal seperti yang Anda harapkan.
Saran Kiwy tentang cat -A
juga melakukan pekerjaan:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Catatan: saat menggunakan echo "..." | hd
, Anda memiliki peluang bash akan menggantikan bagian dari string yang Anda coba periksa. Ini menjadi perhatian khusus saat mencoba memeriksa komponen skrip.
Misalnya coba:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Metode ini mengganti komponen dengan teks yang relevan. Untuk menghindarinya, gunakan salah satu pendekatan berikut. Perhatikan penggunaan tanda kutip tunggal ('
), dan "dikutip heredoc " ("EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
echo "<your command>" | hd
harus bekerja. Cari backspace (0x08) atau karakter dengan kode>=80. echo "<your command>" | wc -b
dan memeriksa apakah hitungan sesuai dengan yang Anda lihat juga merupakan ide yang bagus.
Menyalin barang dari file yang dihasilkan oleh apa pun dengan nama "Office" berbahaya, karena perangkat lunak semacam itu sering mengambil kebebasan untuk mengganti karakter:dalam bahasa Prancis, cari tanda kutip ganda diganti dengan "guillemets", dalam bahasa Inggris untuk tanda kutip biasa diganti dengan mereka membuka/menutup ekuivalen. Yang paling sulit yang pernah saya temukan adalah ruang non-breaking dengan lebar 0 di tengah nama file (3 hari waktu henti server...).