Як отримати доступ до останнього повернутого значення в 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змінній, яку ви можете використовувати скільки завгодно разів.


10
Це не правильна відповідь. $? є.
mcmlxxxiii

@mcmlxxxiii: $?не містить шляхів.
choroba

1
Вибачте, мене збентежило неправильне використання терміна returnу питанні. Ваша відповідь абсолютно правильна на вищезазначене питання.
mcmlxxxiii

4
$?містить статус виходу останньої команди
Бретт Вагнер

Це була відповідь, яку я шукав. Мене цікавить вихід попередньої команди, а не значення успіху / невдачі. Тож дякую!
Джошуа Пінтер

74

Для цього немає спеціальної змінної bash.

$? містить код виходу останньої команди (0 = успіх,> 0 = код помилки)

Ви можете використовувати висновок findз -execпрапором, як це:

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

The {}замінюється на ім'я файлу, знайдене find. Це виконає команду для кожного знайденого файлу. Якщо ви хочете виконати команду з усіма знайденими файлами в якості аргументів, використовуйте a +в кінці так:

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

Це відкриє один екземпляр emacs з усіма знайденими в ньому файлами .wsdl.

Більш загальним рішенням є зберігання результатів у змінній:

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

Це працює з усіма командами, а не просто знаходити. Хоча ви також можете використовувати xargs:

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

Чи можливо $?повернути вихідний код іншої команди? наприклад, ping 1.1.1.1 -w 10; повернути $?
викрадення

1
$?містить код виходу попередньої команди, що б це не було. Отже, відповідь - так.
ахільсенд

43

Ось швидкий злом, який повинен робити все, що ви хочете, з мінімальними натисканнями клавіш, якщо ви не заперечуєте, що остання команда виконується двічі.

Використовуйте backtick, ala:

`!!`

напр

$ знайти. -імя HardToFind.txt
деякий / божевільний / шлях / до / HardToFind.txt
$ vim `!!`

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


2
Дуже розумний. Я думаю, що це має бути прийнятою відповіддю, оскільки вона вирішує найпоширеніший випадок не знати, що вам потрібен вихід, поки ви вже не запустите команду.
Пол Руан

1
Я згоден, це те, що я прийшов сюди шукати. Якщо робити що-небудь на попередньому рядку, перемагає мою мету, щоб заднім числом вирішити, що я хочу зробити з останнім поверненим значенням. (Оформити замовлення відділення, яке я знайшов git br | grepу своєму випадку)
Джек Кейсі

Один із моїх улюблених, це! Подумайте, я роблю це щодня.
MetalGodwin

Я думаю, що це дуже розумно, що ти можеш це зробити, але не впевнений, наскільки це корисно насправді. Чи вводити текст !!набагато простіше, ніж натискання клавіші вгору? І тоді ви ще можете побачити свою команду. Якщо повторно запустити команду, я вважаю, що просто натиснути на кнопку так само просто (і трохи зрозуміліше і прозоріше),
Svend Hesselholt Henne Hansen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.