Как я получаю название команды последней выполняемой команды?

#! /bin/bash
cd /path/to/ssh_logs || exit 1
for targethost in a b c; do
  log_file="${targethost}/$(date --iso-8601=seconds).log"
  mkdir -p "${targethost}" || { echo "Error: ${targethost}";exit 1; }
  { ssh batchuser@"${targethost}" "$command"; rc=$?;
    echo $'\n'"finished (with exit code ${rc}): $(date --iso-8601=seconds)";
  } >"$log_file" 2>&1
done

Редактирование 1:

Некоторое объяснение потребовало (я также изменил детали сценария):

  1. В каталоге – /path/to/ssh_logs в этом примере – создается один подкаталог для каждого целевого узла, в который помещаются выходные файлы. Альтернатива должна поместить все файлы в тот же каталог и сделать часть хоста имени файла. Это - больше вопрос вкуса (для разумных сумм файлов). Таким образом первый шаг должен попытаться измениться на этот каталог (и аварийное прекращение работы, если это перестало работать).
  2. for targethost in a b c; do ... ; done цикл по хостам. В примере имена хостов трудно кодируются в сценарии. Кроме того, Вы могли записать им в текстовом файле, один на строку или разделенный пространством, и получить имена в сценарий этот путь: for targethost in $(<targethosts.txt); do
  3. Путь выходного файла является подкаталогом для того хоста, штампа текущего времени и ".log".
  4. Подкаталог создается, если он еще не существует (сценарий печатает хост и прерывается, если это перестало работать).
  5. Вывод двух команд перенаправляется в файл: ssh называют себя и – если Вам нравится – метка времени (включая код выхода ssh) сразу после ssh закончилась так, чтобы Вы видели от журнала, сколько времени это взяло. После stdout команд был перенаправлен в файл, stderr перенаправляется к stdout так, чтобы сообщения там добрались до файла, также.
4
20.01.2015, 19:57
2 ответа

Вы можете выбрать определенное слово из последней напечатанной команды !!: и дизайн слова. Как слово дизайна вам нужна 0 . Вы можете найти ^ и $ тоже полезно. Из человек Bash :

Указатели слова

0 (ноль) Zeroth Word. Для оболочки это командное слово.

^ Первый аргумент. То есть слово 1.

$ Последний аргумент.

Так что в вашем случае попробуйте:

echo !!:0
7
27.01.2020, 20:47

В интерактивном режиме проще всего сделать это с помощью комбинации клавиш alt+0 и alt+. . Клавиша alt+. означает "вызывать n-е слово из предыдущей строки" (по умолчанию последнее) и alt++ дает ему аргумент 0.

Это должно работать для интерактивного базирования на большинстве систем (в общем случае, все оболочки, которые используют readline в качестве библиотеки входных данных).

https://stackoverflow.com/questions/4009412/bash-how-to-use-arguments-from-previous-command

4
27.01.2020, 20:47

Теги

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