Как получить доступ к последнему возвращаемому значению в bash?

Простой сценарий: я ищу wsdl файл потерян в середине проекта.

$ find -name '*.wsdl'./some/very/very/long/way/to/some/lost/directory/filename.wsdl

Теперь, когда я знаю, где он находится, я хочу что-то сделать с этим файлом, скажем, отредактировать его. Вместо того, чтобы копировать / вставлять путь за моей командой, можно ли использовать путь, возвращаемый find раньше? Точно так же, как можно получить доступ к последнему аргументу, который вы ввели с помощью !$ или вы в последний раз командовали с !!.
Я читал, что это было возможно с $?, но это только возвращает мне ошибку: 0: command not found

$ echo $?0: command not found

Для этого нет специальной переменной bash.

$?> содержит код выхода последней команды (0 = успех, 0 = код ошибки)

Вы можете использовать выходные данные find с -exec флаг, вот такой:

 find -name  '*.wsdl' -exec emacs {} \;

То {} заменяется именем файла, найденным с помощью find. Это приведет к выполнению команды для каждого найденного файла. Если вы хотите выполнить команду со всеми найденными файлами в качестве аргументов, используйте + в конце, как это:

  find -name '*.wsdl' -exec emacs {} +

Это открыло бы один экземпляр emacs со всеми найденными .wsdl-файлами, открытыми в нем.

Более общим решением является сохранение выходных данных в переменной:

result=$(find -name '*.wsdl')emacs $result

Это работает со всеми командами, а не только с поиском. Хотя вы также можете использовать xargs:

  find -name '*.wsdl' | xargs emacs {}

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

Используйте обратный отсчет, аля:

`!!`

напр.

$ найти . - имя HardToFind.txtsome/crazy/path/to/HardToFind.txt $ vim `!!`

* редактировать: я вижу, что приведенный выше связанный вопрос "возможно, обманутый" также содержит этот ответ. все еще имеет непосредственное отношение к этому вопросу, поэтому оставляю его, но извините за обман.

Запустите команду в командной строке:

output=$(find -name '*.wsdl')

Выходные данные теперь сохраняются в output переменная, которую вы можете использовать столько раз, сколько захотите, с помощью следующей команды:

echo "$output"

`!!` это отличное решение, но если вы хотите быть еще быстрее, вы могли бы использовать псевдонимы.

К сожалению, это не сработает:

~$ alias test='echo `!!`'~$ testzsh: command not found: !!

Поэтому вместо этого используйте `fc -e -` Примеры псевдонимов, которые я использую:

копирование выходных данных:

alias co='echo `fc -e -` | xclip -in -selection clipboard'

открыть с помощью vim; если вывод содержит много строк, открывает их все во вкладках:

alias vo='vim -p `fc -e -`'

Это не возвращаемое значение, это выходные данные!

Чтобы уточнить, “возвращаемое значение” всегда является числом. Обычно 0 означает успех, а ненулевое значение означает какую-то неудачу. Строка (или текст), которую выдает команда, называется ее “выводом”, а не “возвращаемым значением”.