2016-06-17 6 views
10

/bin/sh를 호출하고 -c 옵션을 사용하여 '+ x' 즉, '+ x'라는 프로그램을 실행하는데, 이름은 더하기 기호로 시작합니다./bin/sh의 인수에서 '-'처리 : POSIX 대 Bash/Dash/FreeBSD의 구현과 비교

'+ x'는/bin/sh에 의해 옵션 (특히 'x'옵션 사용 안 함)으로 해석되므로/bin/sh는이를 옵션으로 해석하지 않아야합니다. 리눅스에서 대시와 배쉬를 사용

/bin/sh -c -- +x 

:

(1) 첫 번째 변종 : 나는 다음과 같은 다른 결과가 내가 사용하는/빈/쉬에 따라 얻을 명령 + X가 실행됩니다.

FreeBSD의 sh 사용 : 명령이 실행되고 + x 옵션이 설정됩니다.

(2) 두 번째 변형 :

/bin/sh -c +x 

리눅스에 대시와 배쉬 사용은 다음 + X 옵션을 설정하고 옵션 -c 인수 없기 때문에 오류가 있습니다.

FreeBSD의 sh 사용 : + x 명령이 실행됩니다.

(3) 셋째 변이체

/bin/sh -c - +x 

리눅스 일점 배시 사용은 : + (X)를 실행한다.

FreeBSD의 sh 사용 : 명령이 실행되고 + x 옵션이 설정됩니다.

(4) 네 번째 변형 : (제안 의견 추가)

/bin/sh -c+x 

리눅스에 대시와 배쉬를 사용 : 잘못된/잘못된 옵션을 '+'

의 FreeBSD의 쉬를 사용 : 나쁜 -c 옵션


내 질문 : POSIX는 무엇을 처방합니까?

여기 쉬의 POSIX 사양을 읽고 있어요 : http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html

그것에서 인용 : ". 단일 하이픈은 첫 번째 피연산자로 취급하고 무시해야한다 둘 경우 '-'와 '-'입니다 인수로 주어진 경우 또는 다른 피연산자가 단일 하이픈 앞에 오는 경우 결과는 정의되지 않습니다. "

인용 부호가 '-c'다음에 오는 단일 대시에도 적용되는지 확실하지 않습니다.

그래서 Dash/Bash 또는 FreeBSD 중 어느 것이 맞습니까? 또는 POSIX가 양쪽 모두를 허용하기 때문에 양쪽 모두가 옳다면 어떻게이 방법을 이식 할 수 있습니까?

+1

좋은 측정법 :'/ bin/sh -c + x'는 무엇을 하는가? –

+0

@bishop 나는 그렇게 생각하지 않는다. '/ bin/sh'는 인수'-c'와'+ x'를 볼 것이므로'getopt()'는 그것을'/ bin/sh -c + x'로 처리해야합니다. –

+1

'sh'에 대한 POSIX 참조는 다음과 같습니다. http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sh.html –

답변

6

"Posix가 처방하는 것"에 대한 답변은 이미 OP에 있습니다. 그러나 Posix 표준의 중요한 기능은 강조 표시되지 않습니다. -c 옵션에는 인수이 사용되지 않습니다.

당신은 시놉시스에서 볼 수 있습니다

sh -c [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]... 
     command_string [command_name [argument...]] 

은 무엇 -c 플래그가하는 일은 다른 방식으로 해석 될 수있는 위치 매개 변수 ("피연산자")의 원인이다. -c없이, 그들은 [command_file [argument...]]로 해석됩니다 :

sh [-abCefhimnuvx] [-o option]... [+abCefhimnuvx] [+o option]... 
    [command_file [argument...]] 

sh -c+x 오류 이유 방법에 의해, 즉. -c이 인수를 취한 경우 동일한 단어에 인수를 포함하는 것이 합법적입니다.

그래서, 더 구체적인 질문에 대답 :

  1. POSIX는 말한다 "단일 하이픈은 ... 무시 다음 첫 번째 피연산자로 취급되어야한다." 이는 -c 바로 뒤에 -에 적용됩니까?

    A : 가능합니다. -c은 완전한 옵션이므로 -은 피연산자입니다. 대조적으로 -o -에서 -은 피연산자로 처리되지 않습니다. (잘못된 옵션 이름으로 처리 될 것입니다.)

  2. Dash/Bash 또는 FreeBSD 중 어느 것이 맞습니까?

    A :이 경우 Dash와 Bash는 Posix와 호환되며 FreeBSD의 sh는 아닙니다. FreeBSD의 셸은 현재 Posix 사양보다 훨씬 앞선 것으로 POSIX 사양을 완벽하게 준수한다고는 생각하지 않습니다.

  3. +으로 시작하는 명령을 실행하려면 어떻게 sh을 이식 할 수 있습니까?

    A : 나는 다음은 어떤 쉘에서 작동합니다 생각 :

    sh -c " +x" 
    

    " +x" 그것이 + 또는 -sh -c로 시작하지 않기 때문에 옵션으로 인식 피연산자가 발생하지 않습니다 쉘 명령으로 해석되므로 선행 공백은 무시됩니다. 저는 지금 FreeBSD의 ash 복사본을 갖고 있지 않으므로 수정을 환영합니다.

    또는 간단한 화합물 명령을 사용할 수 있습니다 아마도 깨끗한 (당신이 command는 POSIX 표준 내장 구현을 사용하고있는 쉘을 가정)

    sh -c "{ +x; }" 
    

    은 다음과 같습니다에 대한

    sh -c "command +x" 
    
+0

답변에 오타가 있습니다 : ""+ x "'->'"+ x "'. – Kusalananda

+0

같음 :'sh -c '+ x''가 작동 할 것이라고 생각했지만, FreeBSD를 테스트하지 않았고 @ Rhymoid의 코멘트가 나를 설득 시켰습니다. 나는 '+ x'가 까다로워 보이기 때문에 더 나은 결과라고 생각한다. 'sh -c 'command + x''는 이식성이있는 동안 의도가 명확 해 보입니다. – bishop

+0

공간이 너무 이상한 경우 'sh -c':; + x ''도 작동해야합니다. – melpomene