여기에 라인이 있습니다.
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
세미콜론 앞의 줄은 이해하지만 세미콜론 뒤에 이 줄이 어떻게 작동하는지 이해하지 못합니다. 그렇습니까?
after the command(variable assignment)
and then run the command after semi-colon?
그러면 다음 줄은 동일할까요?
variable=`ls -A $1 | grep '[abc]' | ls -1 $1`
감사해요,
답변1
세미콜론은 단순히 두 개의 연속된 명령을 구분합니다. 맨 페이지 ( man bash
)는 다음과 같이 말합니다 (장에서기울기):
;로 구분된 명령 순차적으로 실행된다
예를 들어 다음 채우기는 먼저 명령을 실행 foo
한 다음 명령을 실행합니다 bar
.
foo; bar
예제를 올바르게 구문 분석하려면 먼저 계층적 모델을 구축해야 합니다.
variable=`ls -A $1 | grep '[abc]'; ls -1 $1`
(백틱 안에 있는 것)과 (백틱 안에 있는 것) 로 나눌 수 있습니다 .variable=
...
ls -A $1 | grep '[abc]'; ls -1 $1
백틱은 명령의 출력을 얻는 데 사용됩니다(참조:명령 대체안에 man bash
); 따라서 전체 출력을 ls -A $1 | grep '[abc]'; ls -1 $1
변수에 할당하는 것입니다.
대체 명령의 출력은 파일의 전체 목록(무엇이든 간에...)이 추가된 특정 패턴(숨겨진 힐드 포함)과 일치하는 파일 목록입니다.
답변2
아니요, 그들은 동일하지 않습니다. 후자는 파이프 grep
로 연결됩니다 ls
(거의 확실히 원하는 것이 아닙니다). 세미콜론은 단순히 두 개의 서로 다른 명령을 구분합니다.
먼저, 아마도 다음을 사용하고 싶을 것입니다.$( ... )
백틱 대신 더 새롭고 유연합니다..
다음을 예로 들어보겠습니다.
$ var=`echo foo; echo bar`
$ echo "$var"
foo
bar
$( ... )
백틱(또는 )은 그 사이에 포함된 코드를 실행하는 동안 표준 출력에 인쇄된 내용을 반환하는 것으로 생각할 수 있습니다 .
귀하의 경우 한 번의 출력을 보고 출력에서 , 또는 가 포함 된 ls -A $1
줄을 찾은 다음 의 단일 열 출력을 인쇄합니다 . 일반적으로 이것은 나쁜 생각입니다.a
b
c
ls -1 $1
ls를 구문 분석하면 안 됩니다..