와 을 사용하는 것의 차이점은 무엇입니까? 그리고 스크립트를 실행해 보세요

와 을 사용하는 것의 차이점은 무엇입니까? 그리고 스크립트를 실행해 보세요

나는 이것을 메인 쉘로 사용 bash하지만 이것은 공개 질문이며 다른 쉘에 대한 답변도 bash매우 환영합니다.

대화형으로 입력하는 경우

#original line 
#wget http://something.com && unzip something && mv -f something /home/poney/ 
#new line
wget http://something.com ; unzip something ; mv -f something /home/poney/

다음 줄을 포함하는 스크립트와 비교하여 실행 힙, 순서, 메모리, 해석, 권한에 차이가 있습니까?

#!/bin/bash
wget http://something.com
unzip something 
mv -f something /home/poney/

첨부된:

스크립트를 실행하는 것이 3개의 명령을 연속으로 입력하는 것보다 확실히 짧다는 사실을 제외하면.

답변1

예, 큰 차이가 있습니다. &&단락이므로 이전 명령이 종료 코드를 반환하는 경우에만 후속 명령이 실행됩니다 0.

에서 인용수동:

식 1 && 식 2

True if both expression1 and expression2 are true.

반면에 스크립트에는 다음이 포함됩니다.

expression1
expression2

첫 번째 표현식이 실패하더라도 두 번째 표현식이 실행됩니다. (라고 말하여 오류 발생 시 종료할 스크립트를 지정하지 않는 한 set -e)


편집: 귀하의 의견과 관련하여 다음 사항을 확인하세요.

command1; command2

동일합니다:

command1
command2

정답은대개. Bash는 명령문 중 하나를 평가하기 전에 전체 명령문 블록을 구문 분석합니다. A ; 는 이전 명령을 평가하지 않습니다. 이전 명령이 이후 명령의 구문 분석 방식에 영향을 미치는 경우 차이점을 알 수 있습니다.

alias별칭이 포함된 파일을 고려해 보겠습니다 . 항목이 포함된 파일을 이라고 부르겠습니다 .

alias f="echo foo"

이제 다음을 포함하는 스크립트를 고려해보세요.

shopt -s expand_aliases
source ./alias
f

또 다른 내용은 다음과 같습니다.

shopt -s expand_aliases; source ./alias; f

그러면 둘 다 동일한 출력을 생성할 것이라고 생각할 수 있습니다.

내 대답은 아니오 야. 첫 번째는 생성되지만 foo두 번째는 다음을 보고합니다.

... f: command not found

expand_aliases좀 더 명확히 하자면, 이것이 문제의 원인은 아닙니다 . 문제는 다음과 같은 진술로 인해 발생합니다.

alias f="echo foo"; f

~ 할 것이다에프한 번에 완료됩니다. 쉘은 f그것이 무엇인지 실제로 알지 못하므로 파서가 멈추게 됩니다.

답변2

예, &&조건입니다. 다음 명령은 이전 명령이 반환되는 경우에만 시작됩니다 0(오류 없이 종료됨). 반면에 스크립트에는 이 컨트롤이 없습니다. wget은 오류로 종료되며 계속해서 압축을 풀고 이동하려고 시도합니다.

스크립트의 온라인 버전은 다음과 같습니다.

wget http://something.com ; unzip something ; mv -f something /home/poney/

답변3

위와 다른 점은 쉘 스크립트가 별도의 쉘에서 실행되므로 환경에 대한 변경사항이 전파되지 않는다는 것입니다. 예를 들어, 대화형 셸에 입력하면

test -f foo && file=foo || file=other

그런 다음 대화형 쉘에는 foo 파일이 존재하는지, 아니면 일반 파일인지 여부를 포함하는 변수 file( 를 사용하여 읽을 수 있음 $file) 가 포함됩니다 . 이제 같은 것을 쉘 스크립트에 넣어서 인터랙티브 쉘에서 호출하면 인터랙티브 쉘에서는 변수가 설정되지 않지만(물론 쉘 스크립트에서는 설정이 되므로 추후에 활용 가능) 명령) 어디에).foootherfile

관련 정보