为“2>/dev/null &”创建一个缩写

pap*_*tka 0 command-line bash shell-script

我正在尝试为自己编写一个 bash 脚本,以便在终端中普遍使用它。它应该将应用程序作为后台进程启动并丢弃它的 stderr 输出。这是我得到的:

 for app in $@; do 
    $app 2>/dev/null
 done
Run Code Online (Sandbox Code Playgroud)

对于没有参数启动的裸应用程序,它似乎工作得很好,例如script.sh firefox gedit但未能执行以下操作:

script.sh "vlc video.mp4"
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何增强这个基本脚本以处理将参数/文件作为输入的应用程序?也许已经有一个我可以使用的工具?

Kus*_*nda 5

有两个问题:

  1. $@不带引号的使用。

    这将使循环迭代vlcvideo.mp4作为两个单独的项目,即使它们在脚本调用中位于同一个带引号的字符串中。

  2. 在变量中使用命令。

    如果命令比单个简单命令更复杂,那么这将不起作用。您必须改为eval使用给定的字符串。

考虑到这一点,您的脚本可能看起来像

#!/bin/sh

for cmd do  # or:  for cmd in "$@"; do
    eval "$cmd" 2>/dev/null
done
Run Code Online (Sandbox Code Playgroud)

称其为

./script 'echo "hello world"' 'vim "$HOME/.profile"' 'tr a-z A-Z <"$HOME/.profile" | grep -c EXPORT'
Run Code Online (Sandbox Code Playgroud)

将首先运行echo "hello world",当它完成时,它将打开vim以在第二个命令中编辑命名文件。最后一个命令更复杂,但由我们使用的事实处理eval(它只是将所有字母字符更改为大写并计算字符串EXPORT在文件中出现的次数)。一旦vim会话退出,它就会运行。

有了这个,你甚至可以做

./script 'd=$HOME' 'ls "$d"'
Run Code Online (Sandbox Code Playgroud)

即,设置在后面的命令中使用的变量。这是有效的,因为调用的命令eval与脚本在相同的环境中运行。如果您将命令作为后台任务启动,这将不起作用,正如您的问题标题所暗示的那样。