在bash中noop [:]的用例是什么?

Man*_*nde 106 bash shell no-op

我在bash(:)中搜索了noop,但无法找到任何好的信息.这个运营商的确切目的或用例是什么?

我试过跟随,它对我来说是这样的:

[mandy@root]$ a=11
[mandy@root]$ b=20
[mandy@root]$ c=30
[mandy@root]$ echo $a; : echo $b ; echo $c
10
30
Run Code Online (Sandbox Code Playgroud)

请告知我这个运营商的任何实例或必须使用它的任何用例.

Gil*_*il' 151

由于历史原因,它更多.内置的冒号:完全等同于true.true当返回值很重要时使用它是传统的,例如在无限循环中:

while true; do
  echo 'Going on forever'
done
Run Code Online (Sandbox Code Playgroud)

:当shell语法需要命令但你无所事事时,它是传统的.

while keep_waiting; do
  : # busy-wait
done
Run Code Online (Sandbox Code Playgroud)

:内置日期一路回汤普森壳,它是目前Unix的V6发动机.:是Thompson shell goto声明的标签指示器.标签可以是任何文本,因此:作为评论指标加倍(如果没有goto comment,则: comment实际上是评论).在Bourne shell中没有goto但保留:.

使用一个常见的成语:: ${var=VALUE},这台varVALUE,如果它被清除的和做什么,如果var已被设置.此构造仅以变量替换的形式存在,并且此变量替换需要以某种方式成为命令的一部分:no-op命令很好地服务.

另请参阅结肠构建的目的是什么?.

  • 好总结.另外,最初的Bourne shell没有使用`#`作为评论(或`#!/ bin/sh` shebangs); `:`命令引入了评论,并且在他们的评论中为那些制作了一盒漂亮星星的天真程序员提出了惨败:`:****`(或者更糟糕的是,`:***`). (11认同)
  • 因为`:`是一个命令,shell在发现`:`忽略它们之前仍然必须处理它的参数.大多数情况下,你只是让shell在将`*`扩展到当前目录中的文件列表时做了额外的工作; 它实际上不会影响脚本的工作方式. (7认同)
  • @JonathanLeffler:对我感到羞耻,但我不明白。`:* * *`会发生什么? (2认同)
  • 我有时使用`while:; 做...; 如果我想要快速且肮脏的无限循环,请完成。(通常在循环中有一个“ sleep”,我输入Ctrl-C杀死它。) (2认同)

Ste*_*ler 16

当我注释掉所有代码时,我将它用于if语句.例如,你有一个测试:

if [ "$foo" != "1" ]
then
    echo Success
fi
Run Code Online (Sandbox Code Playgroud)

但是你想暂时注释掉其中包含的所有内容:

if [ "$foo" != "1" ]
then
    #echo Success
fi
Run Code Online (Sandbox Code Playgroud)

这导致bash发出语法错误:

line 4: syntax error near unexpected token `fi'
line 4: `fi'
Run Code Online (Sandbox Code Playgroud)

Bash不能有空块(WTF).所以你添加一个no-op:

if [ "$foo" != "1" ]
then
    #echo Success
    :
fi
Run Code Online (Sandbox Code Playgroud)

或者您可以使用no-op来注释掉这些行:

if [ "$foo" != "1" ]
then
    : echo Success
fi
Run Code Online (Sandbox Code Playgroud)


Cri*_*ole 9

如果你使用set- e那么|| :是一个很好的方法,如果发生故障(它显然使它通过)退出脚本.

  • 我发现这对于某些 shell 脚本调用应用程序很有用。例如,Mac 上的 Automator 将因错误而退出,并且不会告诉您原因。但使用`|| :` 然后稍后使用 `exit 0` 自行处理错误,这样您就可以在调试期间将所有 stdout 和 stderr 显示到应用程序窗口。考虑 `{ foo ... 2>&1; } || :` 这比设置更复杂的陷阱和如果-那么要简单得多。 (2认同)

Mar*_*ark 7

您将使用:提供成功但不执行任何操作的命令.在此示例中,默认情况下,通过将其设置为"verbosity"命令:.'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  
Run Code Online (Sandbox Code Playgroud)


Uly*_* BN 5

忽略alias参数

有时候,您想要一个不带任何参数的别名。您可以使用:

> alias alert_with_args='echo hello there'

> alias alert='echo hello there;:'

> alert_with_args blabla
hello there blabla

> alert blabla
hello there
Run Code Online (Sandbox Code Playgroud)

  • 问题不是它是如何工作的,而是_用例是什么。的确,我的回答有点类似于/sf/answers/2601952881/。但这确实不是同一用例。我很乐意改善答案,但我真的不知道这里的情况。 (2认同)
  • 用`#`可以达到同样的效果 (2认同)
  • @ZoeyHewll,不完全是。由于别名在任何形式的执行之前都被“文本地”替换,因此对`#`使用别名会使在同一行上语法之后出现的所有内容都被忽略。这确实是不同的(考虑“ my_alias arg; other_command”,或者相反,“ my_alias arg1 {BACKSLASH} {NEWLINE} arg2`),并且可能不是您想要的,因为它可能会导致语法错误(猜测my_alias;做些什么? true; done`或`while true; do my_alias; done`会做)。 (2认同)

小智 5

一种用途是作为多行注释,或者通过将其与此处文件结合使用来注释掉部分代码以用于测试目的。

: << 'EOF'

This part of the script is a commented out

EOF
Run Code Online (Sandbox Code Playgroud)

不要忘记使用引号,EOF这样里面的任何代码都不会被评估,比如$(foo). 它也可能会使用一个直观的终结名字一样值得NOTESSCRATCHPADTODO