Как получить доступ к последнему возвращаемому значению в 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
71
задан 25 July 2013 в 17:46

4 ответа

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

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

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

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

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

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

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

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

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

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

  find -name '*.wsdl' | xargs emacs {}
0
ответ дан 25 July 2013 в 17:46

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

Используйте backtick, аля:

`!!`

, например

$ find . -name HardToFind.txt
some/crazy/path/to/HardToFind.txt
$ vim `!!`

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

0
ответ дан 25 July 2013 в 17:46

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

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

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

0
ответ дан 25 July 2013 в 17:46

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

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

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

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

copy output:

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

open with vim; если вывод имеет много строк, открывает их все во вкладках:

alias vo='vim -p `fc -e -`'
0
ответ дан 23 March 2020 в 12:56

Другие вопросы по тегам:

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