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

53

Простой сценарий: я ищу файл 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
    
задан Anto 25.07.2013 в 15:46
источник

3 ответа

29

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

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

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

    
ответ дан choroba 25.07.2013 в 15:57
источник
61

Для этого нет специальной переменной 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 25.07.2013 в 16:12
33

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

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

'!!'

например.

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

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

    
ответ дан Rob 12.09.2014 в 06:50