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

69

Простой сценарий: я ищу 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
Анто
источник
3
Это не возвращаемое значение, это вывод!
MirandaVeracruzDeLaHoyaCardina
Чтобы уточнить, «возвращаемое значение» всегда является числом. Обычно 0 означает успех, а ненулевой означает какой-то сбой. Строка (или текст), которую выдает команда, называется ее «выводом», а не «возвращаемым значением».
Майкл Дорст

Ответы:

33

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

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

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

choroba
источник
11
Это не правильный ответ. $? является.
mcmlxxxiii
@mcmlxxxiii: $?не содержит путей.
Чороба
1
Мои извинения, я был смущен неправильным использованием термина returnв вопросе. Ваш ответ является абсолютно правильным для вышеуказанного вопроса.
mcmlxxxiii
4
$?содержит статус выхода последней команды
Бретт Вагнер
Это был ответ, который я искал. Меня интересует вывод предыдущей команды, а не возвращаемое значение успеха / неудачи. Так что спасибо тебе!
Джошуа Пинтер
74

Для этого не существует специальной переменной 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 {}
ahilsend
источник
Можно ли $?вернуть код выхода другой команды? например, ping 1.1.1.1 -w 10; вернуть $?
twnaing
1
$?содержит код завершения предыдущей команды, что бы это ни было. Итак, ответ - да.
Ахилсенд
43

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

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

`!!`

например

$ найти. имя HardToFind.txt
некоторые / псих / путь / к / HardToFind.txt
$ vim `!!`

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

обкрадывать
источник
2
Очень умно. Я думаю, что это должен быть принятый ответ, поскольку он решает наиболее распространенный случай, когда вы не знаете, что вам нужен вывод, пока вы не запустите команду.
Пол Руане
1
Я согласен, это то, что я пришел сюда в поисках. Делать что-либо в предыдущей строке противоречит моей цели - задним числом решить, что я хочу сделать что-то с последним возвращенным значением. (Оформите ветку, которую я нашел git br | grepв моем случае)
Джек Кейси
Это один из моих любимых! Думаю, я делаю это на ежедневной основе.
MetalGodwin
Я думаю, что это очень умно, что вы можете сделать это, но не уверен, насколько это действительно полезно. Разве набирать текст !!намного проще, чем нажимать клавишу «вверх»? И тогда вы все еще можете увидеть свою команду. Если повторное выполнение команды является приемлемым, я думаю, что просто нажать вверх так же легко (и немного более понятно и прозрачно),
Свенд Хессельхольт, Хенне Хансен,