'#'문자를 명령 줄 인수로 전달할 수 없습니다


36

#명령 줄 인수로 시작하는 문자열을 전달할 수 없습니다 .

간단한 테스트는 다음과 같습니다.

#include <stdio.h>

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

    putchar('\n');

    return 0;
}

다음과 같이 인수를 입력하면

2 4 # 5 6

의 값 argc입니다 3하지 6. 읽고 읽습니다 #. 이유를 모르겠으며 C 프로그래밍 언어C Primer Plus 사본에서 답을 찾을 수 없습니다 .


44
에 StackOverflow에 구문 강조는 : 잘 당신의 문제를 보여
브래드 알 레드

답변:


47

# 유닉스 쉘에서 주석을 시작합니다. //C에서 .

즉, 쉘이 인수를 프로그램에 전달하면 # 뒤에 나오는 모든 것을 무시합니다. 백 슬래시 또는 따옴표로 이스케이프 처리하면 다른 매개 변수와 같이 취급되며 프로그램이 예상대로 작동해야합니다.

2 4 \# 5 6

또는

2 4 '#' 5 6

또는

2 4 "#" 5 6

참고는 그 #유일한 단어의 시작에 주석 문자입니다 이것은 또한 작동합니다 그래서 :

2 4#5 6

2
이것은 꽤 좋은 목록 인 것 같습니다 unix.stackexchange.com/a/270979
fanduin

22
@ cd-00 쉘이 어떻게 작동하는지 배워야합니다. 이것은 C 코드와 관련이 없습니다.
chepner

3
아, 대화식 쉘 세션 에서 주석을 입력 할 수 있으므로 입력을 마친 후에는 쉘이이를 무시할 수 있습니다. 유용한 기능입니다.
Joker_vD

6
@Joker_vD 쉘을 ​​명령 행 인터페이스로 생각하지만 실제로는 스크립트 인터프리터입니다. 대화식 CLI처럼 사용할 수 있다는 사실은 좋은 보너스입니다. 대화식으로 명령을 입력하는 것과 "스크립트를 실행"할 때 해석이 크게 다르게 작동하는 이유는 무엇입니까? 무엇에 대해 echo echo Hello, World | bash. 대화 형인가요? 아니면 bash <<END?
Christopher Schultz

6
@Joker_vD : 쉘 기록에서 다시 언급하기 위해 대화식 세션에 주석을 자주 입력합니다. 때때로 이것은 커밋 해시 또는 stdout으로 방출 된 다른 ID를 기록하기위한 것입니다. 때로는 명령이 내 미래의 자아에 대한 메모로 실패했다는 점에 유의해야합니다. 때로는 임시 벤치마킹을위한 타이밍 데이터를 기록하기도합니다. 그것은 이다 유용한 기능입니다.
wchargin

12

명령 행 인수를 통해 값을 전달할 때 다음 지시 사항을 따라야합니다. 다음 문자는 일부 상황에서 쉘 자체에 특별한 의미를 가지며 인수에서 이스케이프해야 할 수도 있습니다.

` 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

3
그러면 어떻게 탈출해야합니까?
ilkkachu '11

3
\ - 백 슬래시 .EX를 사용하여 이스케이프 :2 4 \{#,$,&,*} 5 6
VJAYSLN

8

sh유사한 쉘을 사용하기 때문 입니다. 인용 #하거나 사용하여 탈출 \하면 작동합니다.

이것은라고 코멘트 에를 sh. 이 원인 #이 폐기 될 후에 (공간 해쉬) 및 인수. 코드를 문서화하는 데 사용되는 C의 주석과 유사하게 사용됩니다.

로 시작하는 문자열을 에서 변수$ 라고 합니다sh . 변수를 설정하지 않으면 빈 문자열로 확장됩니다.

예를 들어,이 모든 것이 #응용 프로그램 에 전달할 수있는 올바른 방법입니다 .

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

그리고 이것은 다음으로 시작하는 문자열을 전달하는 유효한 방법입니다 $.

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

의 내부 변수 "는 여전히 확장되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.