【问题标题】:Problem with Bash's command_not_found_handle()Bash 的 command_not_found_handle() 问题
【发布时间】:2010-10-11 22:21:35
【问题描述】:

我通过以下命令在 Mac 中收到“找不到命令”错误

md5sum *.java | uniq -d -w32

原因是Mac默认没有-w选项。

我想让 Bash 在发生错误时执行以下操作

  1. 将 g 放在第一个命令的开头
  2. 将 g 放在 | 之后的命令的开头

如何让错误更有用?

[编辑]

问题:如果 Mac 没有该功能,我想使用 coreutils 中的功能。因此,Mac 的命令前面的 g。

【问题讨论】:

  • “默认没有-w选项”是什么意思
  • 你需要安装 coreutils 来获取 Unix 命令。然后,您可以通过将 g 放在任何 Mac 的命令前面来运行 GNU 的命令。
  • 在第一次运行之前加上'g'可以吗?
  • @Mykola:不会好的。在某些情况下,Mac 的命令比 Coreutils 中的要好。反之亦然。

标签: macos bash


【解决方案1】:

在 Mac OS X 上工作:

/sbin/md5 *.java | uniq -d

gnu uniq 见:

http://rudix.org/#coreutils

【讨论】:

  • 而且也不需要 uniq 的 -w32 选项,因为 macos md5 使用与“真实”md5sum 不同的输出格式。 :-)
【解决方案2】:

您不能使用command_not_found_handle(),因为命令确实存在;由于无法识别的参数,它们只是返回一个错误 ($? != 0)。

在这种情况下,您应该明确控制在脚本开头带有平台特定序言的命令,对参数做出最少数量的假设,例如:

# defaults - satisfies most platforms
MD5SUM=md5sum
UNIQ=uniq
# per-platform exceptions
if [ "$OS" == "MacOS" ] ; then
  # use GNU variants by prefixing with g
  MD5SUM="g $MD5SUM"  # or use the native program, MD5SUM=md5
  UNIQ="g $UNIQ"      # or use the native program, UNIQ=uniq
elif [ "$OS" == "SomeOtherOS" ] ; then
  MD5SUM=md5hash # e.g. this platform computes MD5 sums with md5hash
fi
...
# optionally cross-check for GNU variants on all platforms
#  does uniq support -w32? (no error on dry run?) if so, use it!
$UNIQ -w32 /dev/null 2>/dev/null && UNIQ="$UNIQ -w32"
# optionally perform one last validation before proceeding
die() { echo "FATAL: $*" >&2 ; exit $1 ; }
$UNIQ /dev/null >/dev/null   || die $? "uniq is missing or failing: $UNIQ"
$MD5SUM /dev/null >/dev/null || die $? "md5sum is missing or failing: $MD5SUM"
...
$MD5SUM *.java | $UNIQ -d

更新

请注意,这也是一种很好的做法,尤其是如果您的脚本将作为 root 运行,依赖于 $PATH - 您可能希望为此类程序指定完全限定的位置如上面的uniqmd5md5sum,例如UNIQ=/bin/uniqMD5SUM=/sbin/md5sum等)


更新2

自动在一堆命令前加上“g”:

eval `for command in uniq md5sum grep sed ; do
  echo \`echo \$command | tr '[a-z]' '[A-Z]'\`=\"g \$command\"
done`

【讨论】:

  • 似乎我已经为每个Unix命令编写了上面的代码。最快的方法是什么?
  • 您不必对每个命令都执行此操作,只需对有问题的命令执行此操作。但如果你真的必须:eval for command in uniq md5sum grep sed ; do echo `echo \$command | tr '[a-z]' '[A-Z]'`=\"g \$command\" ; done
猜你喜欢
  • 2020-10-06
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2011-03-18
  • 2012-04-15
相关资源
最近更新 更多