Проблема понимая 'хеш' управляет в .sh файле

Кластер ssh походит на идеальный инструмент для того, что Вы пытаетесь сделать.

ClusterSSH является инструментом для внесения того же изменения на нескольких серверах одновременно. Команда 'cssh' открывает консоль администрирования и xterm ко всем указанным хостам. Любой текст, введенный в консоль администрирования, копируется во все окна. Все окна могут также быть введены в непосредственно.

Этот инструмент предназначен для (но не ограничен), кластерное администрирование, куда та же конфигурация или команды должны быть выполнены на каждом узле в кластере. Выполнение этих команд внезапно через этот инструмент гарантирует, что все узлы сохранены в синхронизации.

6
22.07.2018, 03:39
4 ответа

Поскольку Вы вводите команды в оболочке удара, оболочка ищет те команды всюду по переменной $PATH. Хеш является просто индексом, которого управляет, чтобы Вы ввели и где они, как находили, помогли ускорить открытие их в следующий раз.

Примечание: ответ @Anthon дает хорошее определение того, каков хеш!

Например, если Вы выполняете просто команду hash без аргументов Вы получите список того, какие команды были найдены ранее наряду с тем, сколько раз они использовались (т.е.: хиты):

% hash
hits    command
   2    /usr/bin/host
   1    /bin/more
   1    /home/saml/bin/autossh_mail.sh
   3    /usr/bin/zip
   2    /bin/rm
   2    /bin/date
   2    /usr/bin/vim
   1    /usr/bin/htop
   2    /bin/mv
   3    /bin/ps
   8    /usr/bin/ssh
   1    /usr/bin/yum
   1    /usr/bin/xfreerdp
   1    /bin/cp
   2    /bin/mkdir
   4    /usr/bin/man
   1    /usr/bin/gvim
   1    /usr/bin/unzip
   1    /usr/bin/w
   5    /usr/bin/nslookup
  51    /bin/ls
  15    /usr/bin/find

Команда hash node возвращает значение состояния (0 или 1) в зависимости от того, присутствовало ли то значение в списке хеша или нет:

hash node не находится в моем списке

% hash node
bash: hash: node: not found
% echo $?
1

Примечание: Состояние какой-либо ранее команды выполнения временно хранится в $ переменной среды?. Это - то, куда состояние (0 = успех, 1 = отказавший) помещается после того, как каждая команда выполняется.

Конструкция "cmd1" || {"cmd2"...} или оператор. Думайте и/или от логики здесь. Таким образом, это означает, делают первую вещь, если она перестала работать, затем сделайте второе, иначе не делайте второй вещи.

Более тщательно продуманный пример:

% true && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 1

% false && echo "1st cmd ret. 1" || echo "1st cmd ret. 0"
1st cmd ret. 0

Логика всегда путает (по крайней мере, мне), потому что 1, возвращаемый, показывает отказавшую команду, в то время как 0, возвращаемый, показывает, что это работало успешно.

4
27.01.2020, 20:25
  • 1
    Allright Спасибо! Благодаря Вашим ответам, я действительно понимал этот код и я сузил проблему к Своему $PATH, пропускает запись 'узла' при доступе из sh файла. спасибо –  Yalla T. 23.04.2013, 19:18
  • 2
    hash node возвраты 1, если узел не находится на ПУТИ, не, если он не был уже хеширован. –  Lri 23.04.2013, 20:48
  • 3
    hash node возвраты 1, если хеширование отключило в Bash:) См. ответ для деталей. –  Evgeny Vereshchagin 29.07.2015, 14:05

В дополнение к ранее отправленным ответам я хотел бы добавить объяснение "2> &1" часть.

> /dev/null

Перенаправляет дескриптор выходного файла (дескрипторы файлов являются числом, которое процесс использует в чтение и запись в файлы, каналы и терминал) в файл/dev/null, который является "grabage, может" системы, поскольку это читает то, что записано в него и отбрасывает те данные.

2>&1

Перенаправляет stderr (вывод "файл" для ошибок) дескриптор файла, который пронумерован 2 к дескриптору файла 1, который был просто перенаправлен к/dev/null, т.е. проигнорирован.

Таким образом, обе из этих частей вместе удостоверяются, что никакой вывод не будет замечен от команды хеша.

4
27.01.2020, 20:25

Из руководства удара:

Each time hash is invoked, the full pathname of the command name
is  determined  by searching the directories in $PATH and remembered.  
Any previously-remembered pathname is discarded.

hash внутренняя команда должна колотить, используемый для работы с хеш-таблицей bash использование для поиска полных путей к командам Вы вводите.

Этот сценарий использует его для проверки node исполняемый файл разыскивается в пути.

1
27.01.2020, 20:25

hash node ПУТЬ поисков для первой команды назвал узел и добавляет или обновляет местоположение узла в списке помнивших местоположений или возвращается 1, если узел не был найден.

хеш используется вместо который потому что:

  • который не определяется POSIX.
  • В некоторых средах, который является csh сценарием, который может изменить ПУТЬ.
  • Например, в ударе хеш является встроенным, но который не является, и хеш обычно быстрее.

Как OP, упомянутый в комментарии, проблема состояла в том, что узел на самом деле отсутствовал в ПУТИ, когда скрипт был запущен. Так which node имел бы тот же результат.

0
27.01.2020, 20:25

Теги

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