Tidak dapat meneruskan karakter '#' sebagai argumen baris perintah

36

Saya tidak bisa meneruskan string yang dimulai dengan #argumen baris perintah.

Berikut ini adalah tes sederhana:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

Jika saya memasukkan argumen sebagai berikut:

2 4 # 5 6

Nilai argcis 3dan not 6. Bunyinya #dan berhenti di situ. Saya tidak tahu mengapa, dan saya tidak dapat menemukan jawabannya dalam salinan Bahasa Pemrograman C saya dan C Primer Plus .

cd-00
sumber
44
penyorotan sintaks pada StackOverflow menggambarkan masalah Anda dengan baik :)
Brad Allred

Jawaban:

47

#memulai komentar di shell Unix, seperti //di C.

Ini berarti bahwa ketika shell meneruskan argumen ke progam, ia mengabaikan semua yang mengikuti #. Melarikannya dengan garis miring terbalik atau tanda kutip akan berarti diperlakukan seperti parameter lain dan program harus bekerja seperti yang diharapkan.

2 4 \# 5 6

atau

2 4 '#' 5 6

atau

2 4 "#" 5 6

Perhatikan bahwa #ini adalah karakter komentar hanya pada awal kata, jadi ini juga harus berfungsi:

2 4#5 6
fanduin
sumber
2
Ini sepertinya daftar yang cukup bagus unix.stackexchange.com/a/270979
fanduin
22
@ cd-00 Anda perlu mempelajari cara kerja shell. Ini tidak ada hubungannya dengan kode C Anda.
chepner
3
Ah, jadi Anda bisa mengetik komentar di sesi shell interaktif , jadi shell bisa mengabaikannya segera setelah Anda selesai mengetik. Apa fitur yang bermanfaat.
Joker_vD
6
@ Joker_vD Meskipun Anda menganggap shell sebagai antarmuka baris perintah, sebenarnya itu adalah penerjemah skrip. Fakta bahwa Anda dapat menggunakannya seperti CLI interaktif adalah bonus yang bagus. Mengapa yang ditafsirkan berperilaku berbeda secara signifikan ketika Anda "menjalankan skrip" versus mengetik perintah secara interaktif? Bagaimana dengan echo echo Hello, World | bash. Apakah itu interaktif? Atau mungkin bash <<END?
Christopher Schultz
6
@ Joker_vD: Saya sering mengetik komentar di sesi interaktif untuk merujuk kembali ke dalam riwayat shell saya. Terkadang ini untuk merekam hash komit atau ID lain yang dipancarkan ke stdout; kadang-kadang perlu dicatat bahwa perintah gagal sebagai catatan untuk diri saya di masa depan; terkadang untuk merekam data waktu untuk pembandingan ad hoc. Ini adalah fitur yang bermanfaat.
wchargin
12

Ketika melewati nilai melalui argumen baris perintah Anda harus berjalan melalui instruksi berikut ini. Karakter berikut memiliki arti khusus untuk shell itu sendiri dalam beberapa konteks dan mungkin perlu diloloskan dalam argumen:

` Backtick (U+0060 Grave Accent)
~ Tilde (U+007E)
! Exclamation mark (U+0021)
# Hash (U+0023 Number Sign)
$ Dollar sign (U+0024)
& Ampersand (U+0026)
* Asterisk (U+002A)
( Left Parenthesis (U+0028)
) Right parenthesis (U+0029)
 (⇥) Tab (U+0009)
{ Left brace (U+007B Left Curly Bracket)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1
VJAYSLN
sumber
3
Bagaimana mereka bisa melarikan diri?
ilkkachu
3
\ - Lolos dengan menggunakan backslash .EX:2 4 \{#,$,&,*} 5 6
VJAYSLN
8

Itu karena Anda menggunakan shshell seperti. Mengutip #atau menghindarinya menggunakan \dan itu akan berhasil.

Ini disebut komentar di sh. Ini menyebabkan #(spasi-hash) dan argumen setelahnya dibuang. Ini digunakan mirip dengan komentar di C, di mana digunakan untuk mendokumentasikan kode.

String yang dimulai dengan $disebut variabel dalam sh. Jika Anda belum menetapkan variabel, itu akan diperluas ke string kosong.

Misalnya, semua ini akan menjadi cara yang valid untuk meneruskan #ke aplikasi Anda:

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

Dan ini akan menjadi cara yang valid untuk meneruskan string yang dimulai dengan $:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

Harap dicatat bahwa variabel di dalam "s masih diperluas.

SS Anne
sumber