`bash` 옵션에서 마지막“-”(하이픈)은 무엇을 의미합니까?


15

이 튜토리얼 에서는 다음 명령을 실행해야합니다.

# curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

마지막 -(하이픈) bash은 무엇 을 의미합니까?

나는 이것으로 많은 명령을 보았고 논리적 인 설명을 찾지 못했고 구글 검색을 재구성하는 방법을 찾지 못했습니다. 파이프 명령의 출력입니까?



2
네트워크에서 물건을 다운로드하여 sudo bash소리에 직접 연결하는 것은 정말 무섭습니다. 그러한 관행을 장려하지 않는 자습서를 찾아보십시오.
hmakholm은 Monica 님을 지난

그것의 고궁 박물원 튜토리얼,하지만 난 ... 당신과 함께 동의
오마르 BISTAMI

1
기호가있는 것을 검색해야하는 경우을 시도하십시오 symbolhound.com.
Joe

답변:


31

Bash는 다소 비표준적인 방식으로 작동합니다 -.

POSIX의 말 :

지침 10 : 옵션 인수가 아닌
첫 번째 --인수는 옵션의 끝을 나타내는 구분 기호로 받아 들여야합니다. 다음 인수는 -문자로 시작하더라도 피연산자로 취급되어야합니다 .

[…]

지침 13 :
피연산자를 사용하여 읽기 또는 쓰기를 위해 열 파일을 나타내는 유틸리티의 경우, -피연산자는 표준 입력 (또는 출력 파일이 지정되었다는 것이 명확 할 때 표준 출력) 또는 파일 이름이 -.

-표준 입력 또는 출력을 의미 하는 피연산자 를 승인하거나 수용하지 않기 위해이 지침에 따라 POSIX.1-2017의 Shell and Utilities 볼륨에 설명 된 유틸리티가 필요한 경우 ,이 사용법은 OPERANDS 섹션에 설명되어 있습니다. 그렇지 않으면, 그러한 유틸리티가 피연산자를 사용하여 파일을 나타내는 경우, 피연산자 -가 표준 입력 (또는 표준 출력) 또는 파일 이름 을 나타내는 지 여부에 따라 구현 정의됩니다 -.

그러나 다음 man 1 bash과 같이 읽습니다.

A --는 옵션의 끝을 알리고 추가 옵션 처리를 비활성화합니다. 뒤에 나오는 모든 인수 --는 파일 이름 및 인수로 처리됩니다. 인수는 -에 해당합니다 --.

따라서 Bash -는 표준 입력이나 파일을 의미하지 않으므로 다소 비표준입니다.

이제 당신의 특별한 경우 :

curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

나는 의심 실현하지 않을 수 있습니다이 명령의 저자 -에 해당 --이 경우이다. 필자 는 저자가 표준 입력을 읽었 으면 좋겠다고 생각 하고 지침 13에 따라 작동 bash할 것으로 예상 -했다.

그러나 지침에 따라 작동하더라도 표준 입력이 파이프 인 시점을 감지하고 그에 따라 행동 -하기 때문에 (여기서 제공 bash되지 않는 한 -c) 여기에서 불필요합니다 .

그러나 -지침에 따라 작동하지는 않습니다 --. --그 뒤에 인수가 없기 때문에 여전히 여기에서 불필요합니다.

내 생각에 마지막 -은 아무것도 변하지 않습니다. 명령이 없으면 명령이 작동합니다.

일반적인 방법 ---유용한 방법을 보려면 아래 예 를 살펴보십시오 .


cat내 쿠분투에서 두 지침을 모두 준수하며이 지침을 사용하여 -및의 유용성을 보여줄 것입니다 --.

파일 이름 foo이 존재하게하십시오. 파일을 인쇄합니다 :

cat foo

파일 이름 --help이 존재하게하십시오. 파일을 인쇄하지 않습니다.

cat --help

그러나 이것은 다음과 같은 파일을 인쇄합니다 --help.

cat -- --help

--help표준 입력에서 온 것이 무엇이든 명명 된 파일을 연결합니다 .

cat -- --help -

--항상 ./--help파일로 해석 될 수 있으므로 항상 전달할 수 있기 때문에 실제로 필요하지 않은 것 같습니다 . 그러나 고려

cat "$file"

변수의 내용이 무엇인지 미리 알 수 없을 때. ./절대 경로 일 수도 있고 ./깨질 수도 있기 때문에 앞에 덧붙일 수는 없습니다 . 반면에 이름이 지정된 파일 일 있습니다 --help(왜 그렇지 않습니까?). 이 경우 --매우 유용합니다. 이것은 훨씬 더 강력한 명령입니다.

cat -- "$file"

6

에서는 man bash, 단일 문자 옵션의 끝에있다 : -

--    A -- signals the end of options and disables further option processing.
      Any arguments after the -- are treated as filenames and arguments. An
      argument of - is equivalent to --.

전체 명령을 인용 한 경우,이 경우 -이후 bash에 사용할 이유 가 없지만 해가되지는 않습니다.


답변 주셔서 감사합니다, 예, 나는 완전한 명령을 인용했습니다. 따라서-또는-이후의 옵션은 옵션이 아니라 파일 이름 또는 인수로 표시됩니다. 유용한 예제를 제시해 주시겠습니까?
Omar BISTAMI

1
실제로 이름이 시작되는 스크립트는 가능 -하지만 요구 사항은 아니지만 -/ --가능합니다.
AFH

1
@OmarBISTAMI 명령을 인용하면 쉘이 확장하는 방법에 영향을 주지만 그 뒤에 오는 인수에는 영향을 미치지 않습니다. 합법적 인 인수 주위에 따옴표를 확장하면 원하는 이름이 아닌 명령 이름의 일부가됩니다. 파일 이름을 인수로 사용하는 명령이 있지만 기본적으로 표준 입력을 사용하지 않습니다. 고안된 예제를 사용하면 두 파일 사이에 (터미널 또는 파이프에서) 입력을 샌드위치 할 수 있습니다. cat file1 - file2 > file3.
Joe

1
curl -sL https://rpm.nodesource.com/setup_6.x | sudo -E bash -

bash -bashstdin을 기다리고 있음을 의미합니다 . 따라서 실제로 bash는 왼쪽에있는 명령에 의해 반환되는 모든 것을 실행합니다.|

비슷하지만 쉬운 예는 다음과 같습니다.

echo hello | cat - 여기에 cat'hello'가 인쇄됩니다. 왜? '안녕하세요'를 통해 고양이로 전송되고 있기 때문에 |그리고 cat거기에 아무것도하여 전송을 기다리고 있습니다

이제 전체 명령을 두 가지로 나누겠습니다.

curl -sL https://rpm.nodesource.com/setup_6.x

이 curl 명령은 bash가 이해하고 실행할 수있는 것을 반환합니다.

|curl 명령으로 반환 된 출력을 파이프의 오른쪽으로 보내는 파이프가 있습니다 sudo -E bash -. 마지막으로 sudo -E bash -bash는 전송 된 모든 것을 실행할 준비가되었습니다.

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