【问题标题】:A "try" shell script一个“尝试”的 shell 脚本
【发布时间】:2010-01-19 16:02:31
【问题描述】:

因此,我们的想法是创建一个尝试运行命令的脚本,如果命令失败,它会显示任何警告/错误。我的尝试:

$ cat try.sh
#! /bin/sh
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/temp$$
trap 'rm -f $tempfile >/dev/null 2>&1' 0
trap 'exit 2' 1 2 3 15

echo "$@"
if ! "$@" >$tempfile 2>&1; then
   cat $tempfile;
   false;
fi

你认为这个脚本还可以吗(可移植性和功能性)?

【问题讨论】:

  • 我个人会用 Python 重写它。我很佩服能用 shell 脚本编写出复杂的工作程序的人,但我自己不会冒险。
  • 让脚本执行命令有什么让你直接执行命令没有的?
  • @Steve,大概这将是更大脚本的一部分,以在命令没有失败时抑制输出
  • 我的直觉是这不适用于复杂的引用命令。我赞同 lpthnc 关于用 Python(或 Perl)编写这篇文章的观点。

标签: linux shell portability


【解决方案1】:

我会做出一些改变:

  • 按照 Steve Emmerson 的建议使用 "$@"
  • 不要将tempfile的标准输出重定向到/dev/null;这就是您要在变量中捕获的内容!
  • 考虑mktemp;它更便携。
  • 使用命令的实际退出代码捕获并退出,因此信息不会丢失。

例如,没有错误检查,

tempfile=`mktemp 2>/dev/null || echo /tmp/tempfile$$`
[ -w "$tempfile" ] || { echo "Can't make tempfile" >&2; exit 1; }
"$@" 2> $tempfile
rc=$?
case $rc in
  0) ;;
  *) cat "$tempfile" >&2 ;;
esac
rm -f "$tempfile"
exit $rc

【讨论】:

    【解决方案2】:

    我会在“if”语句中用双引号将 $@ 括起来,以保留单词边界。

    【讨论】:

      猜你喜欢
      • 2012-01-11
      • 2017-01-01
      • 1970-01-01
      • 2013-04-18
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多