답변:
확실치 않은 경우 소스 코드를 읽으십시오. =)
Bash 4.3, shell.c
830 행parse_shell_options()
: 기능 :
/* A single `-' signals the end of options. From the 4.3 BSD sh.
An option `--' means the same thing; this is the standard
getopt(3) meaning. */
if (arg_string[0] == '-' &&
(arg_string[1] == '\0' ||
(arg_string[1] == '-' && arg_string[2] == '\0')))
return (next_arg);
다시 말해, 더 이상 옵션-
이 없다고 말하는 것입니다 . 명령 행에 단어가 더 있으면 단어가로 시작하더라도 파일 이름으로 취급됩니다 -
.
물론 귀하의 예에서는 -
어쨌든 아무것도 따르지 않으므로 완전히 중복됩니다. 즉, bash -
와 정확히 동일합니다bash
.
배쉬는 명령을 받는다
bash -
Bash에게 표준 입력에서 명령을 읽 도록 지시 하는 것은 오해입니다 . 이 상태 입니다 귀하의 예제에서, 배쉬는 표준 입력에서 해당 명령을 읽을 사실, 그것은 그렇게 관계없이이되었는지 여부했을 -
위에서 언급 한 바와 같이, 때문에, 명령 행에서 bash -
동일하다 bash
.
-
stdin을 의미하지 않는 것을 더 설명하려면 다음을 고려하십시오.
이 cat
명령은 -
stdin 으로 해석하도록 설계되었습니다 . 예를 들면 다음과 같습니다.
$ echo xxx | cat /etc/hosts - /etc/shells
127.0.0.1 localhost
xxx
# /etc/shells: valid login shells
/bin/sh
/bin/dash
/bin/bash
/bin/rbash
/bin/zsh
/usr/bin/zsh
/usr/bin/screen
/bin/tcsh
/usr/bin/tcsh
/usr/bin/tmux
/bin/ksh93
대조적으로, /bin/date
다음 /bin/hostname
을 시도 하여 Bash를 실행할 수 없습니다 .
$ echo date | bash - hostname
/bin/hostname: /bin/hostname: cannot execute binary file
오히려 /bin/hostname
이진 gobbledygook이기 때문에 쉘 스크립트 파일 로 해석하려고 시도합니다 .
둘 중 하나를 date +%s
사용하여 실행할 수 없습니다 bash -
.
$ date +%s
1448696965
$ echo date | bash -
Sat Nov 28 07:49:31 UTC 2015
$ echo date | bash - +%s
bash: +%s: No such file or directory
xargs bash
대신 쓸 수 있습니까 ? 아니요 curl | xargs bash
. 스크립트 내용을 명령 줄 인수로 사용하여 bash를 호출합니다. 내용의 첫 번째 단어가 첫 번째 인수이며 스크립트 파일 이름으로 잘못 해석 될 수 있습니다.
An argument of - is equivalent to --.
xargs
대신 실제로 사용하고 싶다면 (작은 입력 스크립트의 제한된 시나리오에서) | xargs bash -c
; 그러나 실제로 이것은 유용하거나 관용적 인 사용이 아닙니다 xargs
.