2017-01-13 1 views
0

내가 bash 스크립트 코드를보고있을 때 가끔 |을보고 때로는 ||을 볼 수 있지만 어떤 것이 더 좋은지는 모른다.bash 어떤 OR 연산자를 사용할 것인가? pipe v double pipe

내가 좋아하는 뭔가를 할 노력하고있어 ..

set -e; 

ret=0 && { which ansible || ret=$?; } 

if [[ ${ret} -ne 0 ]]; then 
    # install ansible here 
fi 

이 시나리오에서 선호되는 OR 연산자를 알려 주시기 바랍니다.

+4

그들은 완전히 다른 것을 의미합니다. | 배관 데이터입니다. || 또는입니다. – ceejayoz

+0

'set e'는 어떻게해야하나요? – melpomene

+0

https://www.gnu.org/software/bash/manual/bashref.html – melpomene

답변

5

|은 OR 연산자가 아닙니다. 당신은 하지만, || 사용할 수 있습니다

which ansible || { 
    true # put your code to install ansible here 
} 

이 해당 인 if에 :

if ! which ansible; then 
    true # put your code to install ansible here 
fi 
그런데

는 - type (쉘 내장)를 사용하는 습관을 고려 which (외부 명령)이 아닙니다. type은 더 빠르며 쉘 동작을 더 잘 이해할 수 있습니다. 실제 명령을 호출하는 쉘 기능에 의해 제공되는 ansible 명령을 사용하는 경우 which은 거기에 있음을 알지 못하지만 type은 사용 가능한 것으로 정확하게 감지합니다 .

+0

가짜 배시 매뉴얼에 'OR'연산자가 있다고하더라도 문자열 비교 연산자로 사용되는 방식에 대해 100 % 사용자라고 할 수 있습니다. http://www.tldp.org/LDP/abs/html/ops.html –

+1

@ l' L' l, ... 나에게 ABS를 인용하지 마십시오. * 실제 * 참조 (공식 매뉴얼, bash-hackers wiki 등)를 찾으십시오. –

+0

그게 잘못 되었나요? 나는 그것을 몰랐다. –

1

하나의 파이프 (한 명령의 파이프 출력을 다음 명령의 입력으로 사용)와 프로세스 제어 OR (이중 파이프)을 사용하는 것과 큰 차이가 있습니다.

cat /etc/issue | less 

이은/etc/issue 파일에 cat 명령을 실행하고, 대신 즉시 stdout에 출력을 보내는이 덜 명령의 입력으로 파이프입니다. 예,이 좋은 예는 대신 간단하게 적은을/etc/문제를 할 수 있기 때문에, 아니다 -하지만 적어도 당신이이 일을 위해

touch /etc/testing || echo Did not work 

를 어떻게 작동하는지 볼 수있는 터치 명령을 실행하거나 시도 달리기. 종료 상태가 0이 아니면 double pipe가 실행되고 echo 명령을 실행하려고 시도합니다. 터치 명령이 작동하면 다른 선택 사항 (이 경우 에코 명령)은 절대로 시도하지 않습니다.