Вопрос Как получить доступ к последнему возвращаемому значению в 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

53
2017-07-25 13:46


происхождения


возможно дублировать Вывод последней команды оболочки - Braiam
Похоже, ладно спасибо. - Anto
Это не возвращаемое значение, это выход! - MirandaVeracruzDeLaHoyaCardina


ответы:


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

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

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


29
2017-07-25 13:57



Это не правильный ответ. $? является. - mcmlxxxiii
@mcmlxxxiii: $? не содержит путей. - choroba
Мои извинения, я был смущен неправильным употреблением термина return в вопросе. Ваш ответ абсолютно правильный для вышеуказанного вопроса. - mcmlxxxiii
$? содержит статус выхода последней команды - Brett Wagner


Для этого нет специальной переменной 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 {}

59
2017-07-25 14:12





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

Использовать backtick, ala:

`!!`

например

$ find. -name HardToFind.txt
некоторые / псих / путь / к / HardToFind.txt
$ vim `!!`

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


33
2017-09-12 04:50



Очень умно. Я думаю, что это должен быть принятый ответ, поскольку он решает наиболее распространенный случай, когда вы не знаете, что вам нужен вывод, пока вы не запустите команду. - Paul Ruane
Я согласен, вот что я здесь искал. Выполнение чего-либо в предыдущей строке поражает мою цель, чтобы задним числом решить, что я хочу что-то сделать с последним возвращенным значением. (Оформить покупку, которую я нашел через git br | grep в моем случае) - Jack Casey
Один из моих любимых, это! Думаю, я это делаю изо дня в день. - MetalGodwin
Я думаю, что это очень умно, что вы можете это сделать, но не знаете, насколько это действительно полезно. Печатает !! это гораздо проще, чем нажатие клавиши вверх? И тогда вы все равно сможете увидеть свою команду. Если запуск команды снова является приемлемым, я думаю, что просто нажимать вверх так же просто (и немного понятнее и прозрачнее), - Svend Hesselholt Henne Hansen