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 입니다.
'source' 카테고리의 다른 글
WPF C#: 끌어서 놓기를 통해 목록 상자의 항목을 재정렬합니다. (0) | 2023.04.25 |
---|---|
Eclipse git 체크아웃(일명 되돌리기)입니다. (0) | 2023.04.25 |
체크아웃하지 않고 분기 포인터를 다른 커밋으로 이동합니다. (0) | 2023.04.25 |
Excel 워크시트에서 sql 삽입 스크립트를 생성합니다. (0) | 2023.04.25 |
Exists 1 또는 Exists*를 사용하는 하위 쿼리입니다. (0) | 2023.04.25 |