Проблема с командой Bash command_not_found_handle () - PullRequest
2 голосов
/ 07 марта 2009

Я получаю ошибку «команда не найдена» в Mac с помощью следующей команды

md5sum *.java | uniq -d -w32

Причина в том, что Mac не имеет опции -w по умолчанию.

Я бы хотел, чтобы Bash делал следующее при возникновении ошибки

  1. поставить g в начале первой команды
  2. ставит g в начале команды после |

Как сделать ошибку более полезной?

[править]

Проблема: если у Mac нет этой функции, я хочу использовать функции в coreutils. Таким образом, перед командами Mac.

Ответы [ 2 ]

3 голосов
/ 07 марта 2009

Вы не можете использовать command_not_found_handle(), потому что команды do существуют; они просто возвращают ошибку ($? != 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

UPDATE

Обратите внимание, что это также хорошая практика, особенно если ваш сценарий будет работать с 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`
0 голосов
/ 07 марта 2009

В Mac OS X работает:

/ sbin / md5 * .java | uniq -d

Для GNU Uniq см .:

http://rudix.org/#coreutils

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...