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)
我的问题是:如何增强这个基本脚本以处理将参数/文件作为输入的应用程序?也许已经有一个我可以使用的工具?
有两个问题:
$@不带引号的使用。
这将使循环迭代vlc并video.mp4作为两个单独的项目,即使它们在脚本调用中位于同一个带引号的字符串中。
在变量中使用命令。
如果命令比单个简单命令更复杂,那么这将不起作用。您必须改为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与脚本在相同的环境中运行。如果您将命令作为后台任务启动,这将不起作用,正如您的问题标题所暗示的那样。