bash Null-operator“:”, 콜론의 요점은 무엇입니까?


13

BASH 스크립트에서 "널"연산자의 요점은 무엇입니까? if말할 필요가 없지만 명령을 제대로 실행하려면 명령이 필요한 자리 표시 자로 사용됩니다 . 그러나 전반적인 용도는 무엇입니까? 언제 사용하겠습니까? 언제 사용하는 것이 합리적입니까?



1
당신이 인용하는 이유는 매우 중요한 것입니다. 왜 더 필요한가?
terdon

답변:


16

매개 변수 확장 부작용이 발생하도록하는 것이 유용한 경우가 있습니다.

예를 들어, 기본값 설정

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

2
두 번째 줄의 작동 방식을 기호별로 설명해 주시겠습니까?
Ruslan

bash 매뉴얼에서 :명령매개 변수 확장 에 대해 읽으십시오 .
glenn jackman

4
@glennjackman이 참조하는 내용을 간략히 설명하기 위해 두 번째 줄은 null 명령 :을 호출하고 ${name:="John Doe"}확장되어 :에 대한 인수로 읽히기 때문에 할당이 발생합니다. :없이 : 쉘은 "John Doe"를 명령으로 실행하거나 $name이미 설정된 경우 값을 시도합니다
imkendal

13

무한 루프에도 사용할 수 있습니다.

while : ; do 
   # ....
done

4
그러나 while true(a) 구두점을 적게 사용하고 (b) C 파생 언어와 더 유사하기 때문에 더 읽기 쉽습니다.
wchargin

9

프로그램을 실행하지 않고 파일을 만드는 데 사용할 수 있습니다.

: > /path/to/file

이것은 프로그램을 touch /path/to/file 실행할 필요가 없기 때문에 무한히 빠르며 touch평범한 것보다 조금 더 휴대하기 쉽습니다.

> /path/to/file

많은 시스템에서 작동하는 것 같습니다. 마찬가지로 파일에 대한 쓰기 권한이 있는지 확인하는 데 사용할 수 있습니다 .

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

그러나 이것도 일반적으로없이 수행 할 수 있습니다 :. 주의 사항 :

  • 파일이 이미 존재하는지 확인하지 않습니다. 그렇지 않은 경우 파일 권한이 있으면 파일이 만들어집니다.
  • 파일이 존재하지 않고 스크립트에 파일을 작성할 수있는 권한이 없으면 "쓰기 권한이 거부되었습니다"라는 메시지가 표시됩니다.

(이보다 신뢰할 수있는 이유는 연결된 질문을 참조하십시오 if [ -w /path/to/file ].)


5

과거에는 Unix V6과 Thompson Shell에서이 문장의 :일부로 실제로 사용되었습니다 goto. 매뉴얼 에 따르면 원래 Unix 버전 3에 나타났습니다.

전체 명령 파일에서 첫 번째 공백이 아닌 문자로 시작하고 뒤에 하나 이상의 공백이 있고 레이블이있는 행을 검색합니다. 이러한 행을 찾으면 goto는 명령 파일 오프셋을 레이블 다음 행으로 재배치하고 종료합니다. 이로 인해 쉘이 레이블이 지정된 행으로 전송됩니다.

요즘에는 bash운영 중단없이 사용되어 성공을 반환합니다. 당신이 보면 사실, 소스 코드 , 당신은 둘 것을 볼 수 true:, 동일한 기능을 사용할 수 int colon_builtin()아래. :기본 제공 명령 이 없으며 /bin/true실제로 수행하는 작업에 대한 상당히 큰 명령 입니다.

:비전문가를 혼동 할 수 있지만, true예를 들어에서 사용 되는 모든 위치에서 사용할 수 있습니다 command_that_can_fail || true. 자세한 내용은 여기를 참조 하십시오 .


3

if부정적인 측면에서만 무언가를 원할 때 긍정적 인 명령 테스트에서 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

:bash가 없으면 구문 오류가 발생합니다.

이것은 지나치게 단순화 된 예입니다. 일반적으로 해당 코드 세그먼트를 작성하지 않고 오류를 생성하지 않는 것이 필요한 경우 예비 코딩에 이러한 기술을 사용합니다.


좋은 대답은 처음에는 분명하지 않지만 테스트 조건 내에서 실제 명령에 가장 유용하다는 if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fi것 입니다. 예를 들어 firefox가 실행되지 않은 경우에만 오류가 표시됩니다. 즉, 명령에 오류가있을 때만 무언가를해야 할 때. pgrep firefox || echo "Firefox not running"좀 더 읽기 쉽고 더 많은 명령을 허용하지만 이 방법은에 해당 합니다
Sergiy Kolodyazhnyy

0

방금 SSH 오류가있는 스크립트에서 스크립트를 사용하여 스크립트 오류를 ​​방지했습니다.

이 경우 사용자가 일련의 서버에 연결할 수 있는지 확인하고 싶습니다. 연결이 정상이면 원격 호스트가 에코를 확인합니다. 연결이 실패하면 SSH가 오류로 응답합니다. 그러나 스크립트가 실패하면 SSH 명령 값이 아닌 0으로 스크립트를 종료하고 싶습니다. 따라서 본질적으로 ||null 명령을 사용하여 SSH 오류를 OR하여 트랩합니다 :. 다음과 같습니다 :

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

그렇게하면 SSH에서 출력을 얻지 만 오류 코드는 얻지 못합니다.

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.