Кластер ssh походит на идеальный инструмент для того, что Вы пытаетесь сделать.
ClusterSSH является инструментом для внесения того же изменения на нескольких серверах одновременно. Команда 'cssh' открывает консоль администрирования и xterm ко всем указанным хостам. Любой текст, введенный в консоль администрирования, копируется во все окна. Все окна могут также быть введены в непосредственно.
Этот инструмент предназначен для (но не ограничен), кластерное администрирование, куда та же конфигурация или команды должны быть выполнены на каждом узле в кластере. Выполнение этих команд внезапно через этот инструмент гарантирует, что все узлы сохранены в синхронизации.
Поскольку Вы вводите команды в оболочке удара, оболочка ищет те команды всюду по переменной $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, возвращаемый, показывает, что это работало успешно.
В дополнение к ранее отправленным ответам я хотел бы добавить объяснение "2> &1" часть.
> /dev/null
Перенаправляет дескриптор выходного файла (дескрипторы файлов являются числом, которое процесс использует в чтение и запись в файлы, каналы и терминал) в файл/dev/null, который является "grabage, может" системы, поскольку это читает то, что записано в него и отбрасывает те данные.
2>&1
Перенаправляет stderr (вывод "файл" для ошибок) дескриптор файла, который пронумерован 2 к дескриптору файла 1, который был просто перенаправлен к/dev/null, т.е. проигнорирован.
Таким образом, обе из этих частей вместе удостоверяются, что никакой вывод не будет замечен от команды хеша.
Из руководства удара:
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
исполняемый файл разыскивается в пути.
hash node
ПУТЬ поисков для первой команды назвал узел и добавляет или обновляет местоположение узла в списке помнивших местоположений или возвращается 1, если узел не был найден.
хеш используется вместо который потому что:
Как OP, упомянутый в комментарии, проблема состояла в том, что узел на самом деле отсутствовал в ПУТИ, когда скрипт был запущен. Так which node
имел бы тот же результат.
hash node
возвраты 1, если узел не находится на ПУТИ, не, если он не был уже хеширован. – Lri 23.04.2013, 20:48hash node
возвраты 1, если хеширование отключило в Bash:) См. ответ для деталей. – Evgeny Vereshchagin 29.07.2015, 14:05