Простой сценарий: я ищу файл 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
Для этого не существует специальной переменной 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 {}
Вот быстрый хак, который должен делать то, что вы хотите, с минимальными нажатиями клавиш, если вы не против, что последняя команда выполняется дважды.
Используйте backtick, аля:
`!!`
, например
$ find . -name HardToFind.txt some/crazy/path/to/HardToFind.txt $ vim `!!`
* edit: я вижу, что связанный выше вопрос «возможно, дублирован» также содержит этот ответ. все еще имеет отношение непосредственно к этому, поэтому оставляю его, но извините за обман.
Запустите команду в подстановке команд:
output=$( find -name '*.wsdl' )
echo "$output"
Теперь выходные данные сохраняются в переменной output
, которую вы можете использовать столько раз, сколько захотите.
`!!`
— отличное решение, но если вы хотите работать еще быстрее, вы можете использовать псевдонимы.
К сожалению, это не сработает:
~$ 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 -`'