Bash的command_not_found_handle()问题

时间:2009-03-07 13:10:09

标签: macos bash

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

md5sum *.java | uniq -d -w32

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

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

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

    如何使错误更有用?

    [编辑]

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

2 个答案:

答案 0 :(得分:3)

您无法使用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等。)


<强> UPDATE2

使用“g”自动为一堆命令添加前缀:

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

答案 1 :(得分:0)

在Mac OS X上运行:

/ sbin / md5 * .java | uniq -d

对于gnu uniq,请参阅:

http://rudix.org/#coreutils