我通过以下命令在Mac中收到“未找到命令”错误
md5sum *.java | uniq -d -w32
原因是默认情况下Mac没有-w选项。
我想让Bash在发生错误时执行以下操作
如何使错误更有用?
[编辑]
问题:如果Mac没有该功能,我想使用coreutils中的功能。因此,Mac的命令前面的g。
答案 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
- 您可能希望指定完全限定上述uniq
或md5
或md5sum
等程序的位置,例如UNIQ=/bin/uniq
,MD5SUM=/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)