要在后台运行程序bash
,没有文本输出,可以使用:1>&- 2>&- &
。我想为此定义一个别名。但是,如果我写在.bashrc
alias nooutput = '1>&- 2>&- &'
该字符串nooutput
被 shell 解释为我想要运行的可执行文件的附加参数(例如文件名)。另外,自动完成似乎不会起作用nooutput
:noou
例如,如果我按 ,然后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"