source

bash에서 noop [:]의 사용 예는 무엇입니까?

manysource 2023. 4. 25. 22:37

bash에서 noop [:]의 사용 예는 무엇입니까?

bash(:)에서 noop을 검색했지만 좋은 정보를 찾을 수 없었습니다.이 작업자의 정확한 목적이나 사용 사례는 무엇입니까?

팔로잉을 시도했더니 이렇게 작동합니다.

[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30

실시간으로 이 운영자의 사용 사례나 의무적으로 사용해야 하는 장소를 알려주세요.

이겁니다.대장이 내장되어 있습니다.:이 말은 정확히 일치합니다.true. 전통적으로 쓰는 말입니다true이 경우 다음과 같이 입력합니다.

while true; do
  echo 'Going on forever'
done

이렇게 쓰는 게 이에요.:셸 구문에 명령이 필요하지만 사용자가 할 일이 없는 경우입니다.

while keep_waiting; do
  : # busy-wait
done

»는 다음과 같습니다.:Unix v6에서 사용되었던 Thompson 쉘까지 거슬러 올라갑니다. :는 톰슨 셸의 라벨 표시기였습니다.goto진술.레이블은 모든 텍스트일 수 있습니다.:댓글 표시기로 두 번 올립니다(없으면 두 번 올립니다.goto comment ,그러면 ,그러면요.: comment사실상 코멘트입니다.)본의 껍데기엔 없어요goto계속 가지고 있었어요.:요.

흔히 쓰는 사자성어입니다.:이(가) 설정됩니다.var로로 이동합니다.VALUE설정되지 않은 경우 및 아무 것도 하지 않는 입니다.var이겁니다.이 구성은 변수 치환의 형태로만 존재하며, 이 변수 치환은 어떻게든 명령의 일부가 되어야 합니다. 즉, no-op 명령이 적절하게 작동합니다.

참고 항목: Colon의 기본 제공 목적은 무엇입니까?

모든 코드를 코멘트할 때 if 스테이트먼트에 사용합니다.예를 들어, 다음과 같은 테스트가 있습니다.

if [ "$foo" != "1" ]
then
    echo Success
fi

다음 항목에 포함된 모든 내용을 일시적으로 설명하려고 합니다.

if [ "$foo" != "1" ]
then
    #echo Success
fi

이로 인해 bash가 다음과 같은 구문 오류를 발생시킵니다.

line 4: syntax error near unexpected token `fi'
line 4: `fi'

Bash에는 빈 블록(WTF)을 사용할 수 없습니다.no-op을 추가합니다.

if [ "$foo" != "1" ]
then
    #echo Success
    :
fi

또는 no-op을 사용하여 라인을 주석으로 표시할 수 있습니다.

if [ "$foo" != "1" ]
then
    : echo Success
fi

★★★★★★★★★★★★★★★★★★★★★★★.set- e그러면요|| :는 오류가 발생한 경우 스크립트를 종료하지 않는 가장 좋은 방법입니다(명시적으로 통과).

이렇게 하면 용할할할것것것것 you를 사용할 수 있습니다.:성공하지만 아무 것도 하지 않는 명령을 제공합니다.이 예에서는 기본적으로"자세함" 명령을 "자세함"으로 설정하여 사용하지 않도록 설정되어 있습니다.:. 'v' 옵션을 선택하면 켜집니다 이렇게 'v'는요?

#!/bin/sh
# example
verbosity=:                         
while getopts v OPT ; do          
   case $OPT in                  
       v)        
           verbosity=/bin/realpath 
       ;;
       *)
           exit "Cancelled"
       ;;             
   esac                          
done                              

# `$verbosity` always succeeds by default, but does nothing.                              
for i in * ; do                   
  echo $i $($verbosity $i)         
done                              

$ example
   file

$ example -v
   file /home/me/file  

여러 줄 설명으로 사용하거나 테스트 목적으로 코드 일부를 설명하여 여기에 있는 파일과 함께 사용할 수 있습니다.

: << 'EOF'

This part of the script is a commented out

EOF

은 꼭 쓰세요.EOF안에 있는 모든 코드가 되지 않도록 합니다.$(foo). 이 또한 직감적으로 사용할 수 있는 터미네이터 이름을 사용할 수도 있습니다NOTES, , 입니다.SCRATCHPAD 또는 , 는는을를(으)입니다.TODO요.

무시합니다.alias(arguarguments입니다.

때로는 인수를 사용하지 않는 별칭을 갖기를 원합니다.이렇게 하다를 사용해서 할 수 있어요.:다음을 참조하십시오

> alias alert_with_args='echo hello there'

> alias alert='echo hello there;:'

> alert_with_args blabla
hello there blabla

> alert blabla
hello there

두 명입니다.

POD 설명을 포함합니다.

꽤 펑키한 응용 프로그램입니다.:POD 주석을 bash 스크립트에 포함시켜 man 페이지를 빠르게 생성할 수 있도록 하기 위한 것입니다.물론 결국에는 전체 스크립트를 Perl로 다시 작성할 것입니다;-)

런타임 함수 바인딩입니다.

런타임에 함수를 바인딩하기 위한 코드 패턴의 일종입니다.F.i. 특정 플래그가 설정된 경우에만 작업을 수행하는 디버깅 기능이 있습니다.

#!/bin/bash
# noop-demo.sh 
shopt -s expand_aliases

dbg=${DBG:-''}

function _log_dbg {
    echo >&2 "[DBG] $@"
}

log_dbg_hook=':'

[ "$dbg" ] && log_dbg_hook='_log_dbg'

alias log_dbg=$log_dbg_hook


echo "Testing noop alias..."
log_dbg 'foo' 'bar'

다음을 얻을 수 있습니다.

$ ./noop-demo.sh 
Testing noop alias...
$ DBG=1 ./noop-demo.sh 
Testing noop alias...
[DBG] foo bar

이 답변과 어느 정도 관련이 있어, 저는 이 no-op이 다중 언어 스크립트를 해킹하기에 편리하다고 생각합니다.예를 들어, 다음은 bash와 vimscript 모두에 대해 유효한 주석입니다.

":" #    this is a comment
":" #    in bash, ‘:’ is a no-op and ‘#’ starts a comment line
":" #    in vimscript, ‘"’ starts a comment line

네 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.true잘된 일이지만요:문장 부호이며 관련이 없는 영어 단어가 아닌 것이 구문 토큰임을 명확히 합니다.


다른 사용자가 다중 언어 스크립트를 작성하는 것과 같은 까다로운 작업을 하는 이유는 다음과 같습니다(대단한 작업 외에도). 일반적으로 여러 언어로 된 스크립트 파일을 파일로 작성하는 경우에 유용합니다.X파일을 참고하세요.Y요.

이러한 경우 두 스크립트를 하나의 다중 언어 파일로 결합하면 에서 작업하지 않아도 됩니다.X길을 정하기 위해서 입니다.Y(단순히 (만들다)입니다"$0"더 중요한 것은, 프로그램을 이동하거나 배포하는 것이 더 편리하다는 것입니다.

  • 일반적인 예입니다.shebangs에는 잘 알려진 오랜 문제가 있습니다. Linux 및 Cygwin을 포함한 대부분의 시스템은 하나의 인수만 인터프리터에 전달할 수 있습니다.다음 쉐방입니다.

    #!/usr/bin/env interpreter --load-libA --load-libB
    

    다음 명령을 실행합니다.

    /usr/bin/env "interpreter --load-libA --load-libB" "/path/to/script"
    

    의도한 바가 아닙니다.

    /usr/bin/env interpreter --load-libA --load-libB "/path/to/script"
    

    따라서 다음과 같은 래퍼 스크립트를 작성하게 됩니다.

    #!/usr/bin/env sh
    /usr/bin/env interpreter --load-libA --load-libB "/path/to/script"
    

    여기서 다색증이 단계로 진입합니다.

  • 좀 더 구체적인 예가 있습니다.저는 Vim을 호출하는 bash 스크립트를 쓴 적이 있습니다.Vim에게 추가 설정을 제공해야 했습니다. 옵션으로 할 수 있습니다.--cmd "arbitrary vimscript command here"하지만 이 설정은 상당히 중요했기 때문에 가능하면 문자열로 삽입하는 것은 끔찍했을 것입니다.따라서 더 나은 해결책은 일부 구성 파일에 정상 참작하여 Vim이 이 파일을 읽도록 하는 것입니다.-S "/path/to/file". 그래서 저는 폴리글롯 bash/vimscript 파일을 가지게 되었습니다 bash/vimscript를 사용합니다.

다른 명령의 성공에 연결하려는 명령이 있다고 가정합니다.

cmd="some command..."
$cmd
[ $? -eq 0 ] && some-other-command

이제 명령을 조건부로 실행하고 실행할 명령을 표시하려고 합니다(드라이 실행).

cmd="some command..."
[ ! -z "$DEBUG" ] && echo $cmd
[ -z "$NOEXEC" ] && $cmd
[ $? -eq 0 ] && {
    cmd="some-other-command"
    [ ! -z "$DEBUG" ] && echo $cmd
    [ -z "$NOEXEC" ] && $cmd
}

따라서 DEBUG 및 NOEXEC를 설정하면 두 번째 명령이 나타나지 않습니다. 첫 번째 명령은 실행되지 않지만(NOEXEC가 비어 있지 않기 때문에), 이 사실을 평가하면 하위 명령이 실행되지 않는다는 의미인 1이 반환되기 때문입니다(예비 실행이기 때문에).이 문제를 해결하려면 noop을 사용하여 스택에 남아 있는 종료 값을 재설정할 수 있습니다.

[ -z "$NOEXEC" ] && $cmd || :

경우에 따라 no-op 절이 코드를 더 쉽게 읽을 수 있습니다.

그것은 의견의 문제일 수 있지만, 여기 예가 있습니다.두 개의 unix 경로를 통해 작동하는 함수를 만들었다고 가정해 보겠습니다.한 경로에서 다른 경로로 cd하는 데 필요한 '변경 경로'를 계산합니다.두 경로가 모두 '/'로 시작하거나 둘 다로 시작하지 않도록 함수에 제한을 둘 수 있습니다.

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        true      # continue with function
    else
        return 1  # Skip function.
    fi

일부 개발자는 no-op을 제거하려고 할 수 있지만, 이는 다음과 같은 조건을 부정하는 것을 의미합니다.

function chgpath() {
    # toC, fromC are the first characters of the argument paths.
    if [[ "$toC" != / || "$fromC" == / ]] && [[ "$toC" == / || "$fromC" != / ]]
    then
        return 1  # Skip function.
    fi

이제, 제 생각에는, 이 기능을 생략할 수 있는 조건이 있다는 가정하에 그렇게 명확하지 않은 것 같습니다.no-op을 제거하고 명확하게 수행하려면 if-clause를 함수 밖으로 이동해야 합니다.

    if [[ "$toC" == / && "$fromC" == / ]] || [[ "$toC" != / && "$fromC" != / ]]
    then
        cdPath=$(chgPath pathA pathB)   # (we moved the conditional outside)

이렇게 하면 더 좋아 보이지만, 대부분의 경우 이 작업을 수행할 수 없습니다. 우리는 기능 내부에서 검사를 수행하기를 원합니다.

그래서 이런 일이 얼마나 자주 일어납니까?매우 흔하지 않다.1년에 한두 번 정도요.그런 일은 자주 일어나요, 그러니 당신도 알아둬야 해요.코드의 가독성이 향상된다고 생각될 때(언어에 관계없이) 사용하는 것을 주저하지 않습니다.

또한 IT 스크립트에서 기본 변수를 정의했습니다.


: ${VARIABLE1:=my_default_value}
: ${VARIABLE2:=other_default_value}
call-my-script ${VARIABLE1} ${VARIABLE2}

RUN 명령을 정렬하기 위해 Docker 파일에서 다음과 같이 사용하는 경우가 있습니다.

RUN : \
    && somecommand1 \
    && somecommand2 \
    && somecommand3

저는 다음 내용보다 더 잘 읽힙니다.

RUN somecommand1 \
    && somecommand2 \
    && somecommand3

하지만 이건 그냥 선호도의 문제일 뿐이죠

명령이 null입니다.[:]는 실제로 true로 내장된 셸의 동의어로 간주됩니다.":""Bash" "Bash" "True(0)" "Da" " $ : $ echo $?# 0' $ : $ 코140 $? # 0 입니다.

while :
do
   operation-1
   operation-2
   ...
   operation-n
done

# Same as:
    while true
    do
      ...
    done

if/then 테스트에 자리 표시자를 배치합니다.

if condition
then :   # Do nothing and branch ahead
else     # Or else ...
   take-some-action
fi


$ : ${username=`whoami`}
$ ${username=`whoami`}   #Gives an error without the leading :

출처: TLDP입니다.

박쥐 테스트 프레임워크에서 사용할 모의 수면 기능을 만들어야 할 때 오늘 noop을 사용했습니다.이를 통해 부작용 없이 빈 함수를 만들 수 있었습니다.

function sleep() {
  :
}

언급URL : https://stackoverflow.com/questions/12404661/what-is-the-use-case-of-noop-in-bash 입니다.