在bash中noop 的用例是什么?

我在bash(:)searchnoop,但没能find任何好的信息。 这个操作符的确切目的或用例是什么?

我试图跟随,这对我来说是这样工作的:

[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 

传统上使用:当shell语法需要一个命令,但你没有任何事情要做。

 while keep_waiting; do : # busy-wait done 

内置的date一直回到Thompson shell ,它是在Unix v6中出现的 。 :是Thompson shell的goto声明的标签指示器。 标签可以是任何文本,因此:作为评论指标翻倍(如果没有goto comment ,则: comment实际上是评论)。 Bourne shell没有goto但是保持:

一个常用的习惯用法是: ${var=VALUE} ,如果var被设置,则将var设置为VALUE ,如果var已经设置,则不执行任何操作。 这个构造只能以variablesreplace的forms存在,并且这个variablesreplace需要以某种方式成为一个命令的一部分:一个无操作命令很好地服务。

另请参见结肠内脏有什么用途? 。

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

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

但是你想暂时注释掉其中一个案例:

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

这导致bash给出一个语法错误:

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

Bash不能有空块(WTF)。 所以你添加一个无操作:

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

你会使用:提供一个成功的命令,但是什么都不做。 在这个例子中,“verbosity”命令是默认closures的,通过设置为: 。 '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 

如果你使用set- e那么|| : || :如果发生故障(明确地使其通过),是一种退出脚本的好方法。

有时no-op子句可以使你的代码更具可读性。

这可能是一个意见问题,但这里是一个例子。 假设你已经创build了一个通过两个unixpath工作的函数。 它计算从一个path到另一个path所需的“更改path”。 你对函数的限制是path必须以“/”开头或者都不能。

 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 

一些开发人员会想要删除无操作,但这将意味着否定条件:

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

现在,在我看来,从if条款中不太清楚你想要跳过这个function的条件。 为了消除这个无操作并且清楚地做到这一点,你需要将if子句移出该函数:

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

这看起来更好,但很多时候我们不能这样做; 我们希望在函数内完成检查。

那么这种情况发生的频率如何? 不经常。 也许一年一两次。 这经常发生,你应该知道这一点。 当我认为它提高了我的代码的可读性(不pipe语言如何)时,我并不回避。

我的两个。

embeddedPOD评论

一个相当时髦的应用是:用于在Bash脚本中embeddedPOD注释 ,以便可以快速生成手册页。 当然,最终用Perl重写整个脚本;-)

运行时函数绑定

这是运行时绑定函数的一种代码模式。 Fi,有一个debuggingfunction,只有当某个标志被设置时才会执行某些操作:

 #!/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 

忽略alias参数

有时候你想要有一个别名,没有任何参数。 你可以使用::

 > alias alert_with_args='echo hello there' > alias alert='echo hello there;:' > alert_with_args blabla hello there blabla > alert blabla hello there 

一个用途是多行注释,或者为了testing的目的而注释掉部分代码,通过与here文件结合使用。

:<

这部分脚本是注释掉的

EOF