2015-05-08 6 views
0

У меня есть сценарий оболочки в моем домашнем каталоге под названием «echo». Я добавил свой домашний каталог на свой путь, чтобы это эхо заменило другое.команда 'which' неверна

Для этого я использовал: export PATH=/home/me:$PATH

Когда я which echo, это показывает, что я хочу. /home/me/echo

Но когда я действительно делаю что-то вроде echo asdf, он использует системное эхо.

Я что-то не так?

+1

Вы пытались выполнить свою программу с ./ перед тем, как заявить, что это файл bash в текущем каталоге? Если вы не в этом текущем каталоге, вы можете поместить путь от корня до сценария оболочки. –

+1

Возможно, эхо-скрипт не может быть в CWD, это одна из веских причин, почему вы можете добавить его в путь. – ssnobody

+1

'echo'is - встроенная команда оболочки. Другими словами, никакого файла 'echo' вообще нет, это все' bash' или что-то еще. –

ответ

1

which - внешняя команда, поэтому она не имеет доступа к встроенным командам, функциям или псевдонимам текущей оболочки. Фактически, по крайней мере, в моей системе /usr/bin/which - это сценарий оболочки, поэтому вы можете изучить его и посмотреть, как он работает.

Если вы хотите узнать, как интерпретирует вашу оболочку, используйте type, а не which. Если вы используете bash, type -a напечатает все возможные значения в порядке очередности. Подробнее см. В документации вашего корпуса.

Для большинства корпусов встроенные команды имеют приоритет над командами в вашем $PATH. Например, все, что имеет встроенный echo, заключается в том, что он быстрее, чем загрузка /bin/echo в память.

Если вы хотите, чтобы ваша собственная команда echo переопределяла встроенный в оболочку echo, вы можете определить его как функцию оболочки.

С другой стороны, переопределение встроенной команды echo не является для меня хорошей идеей. Если он ведет себя так же, как встроенный echo, то не так много смысла. Если это не так, то это может сломать скрипты, которые используют echo, ожидая, что он будет работать определенным образом. Если возможно, я предлагаю дать вам команду по-другому. Если это расширенная версия echo, вы можете даже назвать ее Echo.

1

Скорее всего, используя встроенную оболочку.

Если вы хотите, чтобы в вашем пути вы можете сделать

`который echo` ASDF

1

От this little article that explains the rules, вот список в порядке убывания старшинства:

  1. Псевдонимы
  2. Функции оболочки
  3. встроенные команды оболочки
  4. хэш-таблицы
  5. ПУТЬ вариабельные

echo является встроенной командой оболочки (аль крайней мере, в bash) и PATH имеет самый низкий приоритет. Думаю, вам нужно создать функцию или псевдоним.

+1

Функции почти всегда лучше, чем псевдонимы. –