如何强制Bash单词引用别名,函数,文件等?


13

当试图为一个相关问题添加更多细节时,我意识到我不知道如何指定执行哪种可用的Bash单词类型。根据help type五种单词类型:

  • 别名
  • 关键词
  • 功能
  • 内建的
  • 文件

一个单词可能有几种类型(true仅是示例;更常见的单词是cd):

$ type -a true
true is a shell builtin
true is /bin/true

您如何强制执行特定的同义词?到目前为止,按照优先顺序:

  • 别名:这是一种特殊情况,因为它优先于所有其他同义词。仅当未定义别名时命令失败时,才强制使用此选项。

    $ 
  • 关键词:

    $ 
  • 功能:

    $ 
  • 内置:

    $ builtin true
  • 文件:

    $ command true
    $ $(which true)
    $ /bin/true

部分解决方案

  • 引用单词不包括别名和关键字。那是,

    $ 'true'

    将仅运行函数,内置函数或文件。

Answers:


10

您要问的内容并没有多大意义。

关键字意味着它是外壳语法的一部分。这些通过标记识别。引用它们足以使Shell停止识别。

不过,在大多数shell中都可以为关键字加上别名。因此,别名的优先级高于关键字(实际上,它们的扩展较早,在此之后,您可以拥有更多的别名,关键字的令牌化更多)...

别名(使用定义的zsh别名除外,alias -g仅在命令位置扩展),因此通常不在builtin the-alias

函数的优先级高于内建函数,而内建函数优先于外部命令(然后$PATH确定要使用哪个命令)。

您可以使用以下命令强制内置:

builtin the-cmd and its args

(尽管应该注意,这不是标准命令)。

您可以通过引用别名来禁用别名(尽管引用的版本在某些shell中也可以使用别名)。

因此,例如(此处为zsh语法):

'while'() echo function while
alias 'while=echo alias while'

编写while true实际上会输出alias while true,并且将无法使用while关键字,因为引用它会同时禁用别名和关键字。

您可以使用以下while函数调用该函数:

'whi'le whatever

如果有一个while内置函数(但当然不会在具有while关键字的那些shell中使用它们),则可以这样编写:

builtin while whatever

并调用该while命令,您将编写:

env while whatever

zsh(在非sh仿真中):

command while whatever 

(在其他shell中,command仅阻止功能,而不能内置)

要么

/full/path/to/while whatever

当然,没有什么可以阻止您执行更愚蠢的事情,例如:

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

至少在zsh中是有效的(但很愚蠢)。


引用抑制别名查找,command 抑制函数查找,但是这两个都没有指定将使用其余的哪些同义词。我正在寻找一种指定仅执行特定同义词的方法。
l0b0

@ l0b0“ command”禁止使用所有别名,关键字和内置函数。
2013年

有意义的builtin是,例如在RVM中使用它来覆盖cd以获得不错的效果。
l0b0

你是对的; 我刚刚证实它也抑制了功能。+1。
l0b0

0

对我来说,一个非常有用的成语是:

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

现在,如果我使用指定的-D运行脚本,则激活开发模式,并且cd(或任何其他包装的命令)回显调试信息

这对于运行ssh的脚本特别有用。当然,我可以切换set -x,但这对我来说更有用和可读。


1
这如何回答这个问题?
l0b0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.