在 shell 命令后使用 `1>&- 2>&- &' 作为别名

在 shell 命令后使用 `1>&- 2>&- &' 作为别名

要在后台运行程序bash,没有文本输出,可以使用:1>&- 2>&- &。我想为此定义一个别名。但是,如果我写在.bashrc

alias nooutput = '1>&- 2>&- &'

该字符串nooutput被 shell 解释为我想要运行的可执行文件的附加参数(例如文件名)。另外,自动完成似乎不会起作用nooutputnoou例如,如果我按 ,然后tab,它不会自动完成。

在这种情况下如何使用别名?


GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)我在 UbuntuUbuntu 20.04.3 LTS和 Linux上使用5.4.0-91-generic x86_64,但是,如果有解决方案,我希望它尽可能通用,与特定bash版本或系统架构无关。

答案1

首先,别名允许在用作单词时用字符串代替单词。第一个字一个简单的命令。不在该命令的中间或末尾,因此当您尝试在命令末尾使用别名时,例如myCommand myAlias,它不会像前面提到的那样工作,为什么,别名应该作为命令的第一个单词,例如myAlias myCommand;

但是您使用的后台运行运算符1>&- 2>&- &不能出现在命令的开头(不能 do & myCommand),因此您不能&在别名中使用类似的操作。

第二个问题是,别名名称和别名文本周围不应有空格。

你需要alias nooutput='1>&- 2>&- ';然后运行如下:

nooutput myCommand &

注意:对于几乎所有用途,shell 函数都优于别名。

答案2

Bash 仅支持第一个单词位置的别名(或者在另一个别名之后,如果第一个以空格结尾)。但是,在 zsh 中,您可以将其设为全局别名,这些是从任何位置展开的。

zsh% alias -g nooutput='1>&- 2>&- &'
% (echo foo; sleep 12) nooutput
[1] 15058
...

虽然至少我的 zsh 版本不会从第一个位置以外的地方按制表符补全别名,但我没有查看是否可以配置它。

答案3

您可以使用函数:

run_bg() { eval $@ > /dev/null & }

您可以通过将此函数定义行添加到~/.bashrc.

用法:

run_bg echo "hey"

相关内容