Мой, 'какая' команда может быть неправильной (иногда)?

Вы так уверены, что никогда не будете хотеть использовать летнее время? Что происходит, если правительство места, Вы живете, решает использовать его? Какая цель сохраняет Ваш компьютер часом от синхронизации с реальным миром?

Так или иначе, набор TZ=CST6 - это не часовой пояс, который существует в zoneinfo, это - более старый стандарт переменной среды. Если Вы хотите фактический zoneinfo файл [что можно использовать для localtime], скомпилируйте (использование zic) исходный файл, состоящий из одной строки:

Zone    Etc/CST6         -6:00  -   CST

И используйте TZ=Etc/CST6 и связывайтесь/копируйте получающийся файл в/etc/localtime.

Это имеет преимущество использования надлежащего сокращения, а не ерунды "GMT+06"

17
14.09.2012, 09:27
3 ответа

Три возможности, которые приходят на ум для меня:

  • Псевдоним существует для emacs (который Вы проверили),
  • Функция существует для emacs
  • Новое emacs двоичный файл не находится в хеш-таблице ПУТИ Вашей оболочки.

Можно проверить, есть ли у Вас функция emacs:

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

И удалите его:

unset -f emacs

Ваша оболочка также имеет хеш-таблицу ПУТИ, которая содержит ссылку на каждый двоичный файл в Вашем ПУТИ. Если Вы добавляете новый двоичный файл с тем же именем как существующее в другом месте в Вашем ПУТИ, оболочке нужно сообщить путем обновления хеш-таблицы:

hash -r

Дополнительное объяснение:

which не знает о функциях, поскольку это не встроенный удар:

bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ `which emacs` --version | head -1
GNU Emacs 22.1.1

Новое двоичное поведение хеш-таблицы продемонстрировано этим сценарием.

bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin

bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory

Хотя я не назвал его, which cat всегда возвращал бы первое cat в моем ПУТИ, потому что это не использует хеш-таблицу оболочки.

29
27.01.2020, 19:46
  • 1
    В то время как существует хорошая информация здесь, она пропускает type команда. –  jordanm 07.09.2012, 01:06

Да, не используйте который:

  • В некоторых системах это - внешняя команда, реализованная как csh сценарий, который может прочитать конфигурацию, которая изменяется PATH.
  • Существует встроенное для этого. Два, даже: type и command. POSIX путь:

    command -v emacs       # machine-readable format
    type emacs             # human-only format
    

    В ударе можно также использовать type -p emacs видеть просто путь внешней команды.

Однако здесь, which является на самом деле правильным. Bash хранит информацию о местоположении команды в памяти, так, чтобы это могло выполнить команду быстрее в следующий раз. Вы установили новое emacs исполняемый файл на Вашем PATH, но удар все еще имеет старое расположение в своем кэше. Выполненный hash emacs искать emacs снова, или hash -r освободить кэш.

12
27.01.2020, 19:46

Вы выходили из системы и входили к причине в свой обновленный .bashrc файл входа в систему, который будет перечитан? В противном случае среда Вашей текущей сессии не была обновлена.

1
27.01.2020, 19:46
  • 1
    Если это имело место, `which emacs` --version согласился бы с emacs --version, потому что which наследовал его ПУТЬ от текущей оболочки. –  mrb 06.09.2012, 22:22
  • 2
    @mrb: Точка хорошо взята. –  JRFerguson 06.09.2012, 22:33

Теги

Похожие вопросы