【问题标题】:How to add a `nice` switch to my bash script如何在我的 bash 脚本中添加一个 `nice` 开关
【发布时间】:2017-03-21 22:37:22
【问题描述】:

我有一个运行一些作业的 bash 脚本。有时我希望能够使用nice 运行这些作业,以降低它们在服务器上的优先级。

例如,如果我的可执行文件是a.out,我可以从终端nice a.out 运行以降低作业优先级。

在我的 bash 脚本中,我有一个变量 NICE。我做了以下两件事之一:

# either nice is set
NICE="nice"

# or it is left unset
NICE=""

然后我使用

运行我的工作
"$NICE$ ./a.out

稍后在脚本中。

这在 NICE="nice" 时有效,但在 NICE 设置为 NICE="" 时无效。

解决这个问题的一种方法是使用 if 语句:

if [ "$NICE" == "nice" ]
then
    nice ./a.out
else
    ./a.out
fi

但这变成了 5 或 6 行代码,而不仅仅是一行代码。

是否有可能完成我尝试使用NICE 作为变量来启动可执行文件的功能?

【问题讨论】:

  • 去掉引号:$NICE ./a.out
  • 或者简单地将#renice -10 $$放在脚本的开头,这样您就可以随时删除结尾的#
  • 我怀疑"$NICE$ ./a.out“有效”。

标签: bash scheduling jobs nice


【解决方案1】:

您的第一个猜测几乎正确。

来自 Bash 手册页(重点是我的):

显式空参数(“”或“”)被保留并传递给命令 作为空字符串。未引用的隐式空参数,由 没有值的参数的扩展被删除。 如果一个参数 没有值在双引号内展开,一个空参数 结果并被保留并作为空字符串传递给命令。 当带引号的空参数作为其扩展的单词的一部分出现时 为非 null,则删除 null 参数。也就是 -d'' 这个词 在分词和删除空参数后变为 -d。

所以对于你的情况,你可以简单地去掉引号:

$NICE ./a.out

根据$NICE 的值,将扩展为以下两字命令:

'nice' './a.out'

或一个单词的命令:

'./a.out'

您可以使用set -x 来帮助调试这种扩展——它会打印扩展的单词列表,以便您查看是否有问题。

【讨论】:

  • set -x 是个好建议
猜你喜欢
  • 2022-10-20
  • 2023-01-27
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2016-08-06
相关资源
最近更新 更多