![와 을 사용하는 것의 차이점은 무엇입니까? 그리고 스크립트를 실행해 보세요](https://linux55.com/image/52452/%EC%99%80%20%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EA%B2%83%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%EA%B7%B8%EB%A6%AC%EA%B3%A0%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%B4%20%EB%B3%B4%EC%84%B8%EC%9A%94.png)
나는 이것을 메인 쉘로 사용 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
&&
식 2True 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
) 가 포함됩니다 . 이제 같은 것을 쉘 스크립트에 넣어서 인터랙티브 쉘에서 호출하면 인터랙티브 쉘에서는 변수가 설정되지 않지만(물론 쉘 스크립트에서는 설정이 되므로 추후에 활용 가능) 명령) 어디에).foo
other
file