функция bash не работает так же, как командная строка

Попробуем:

$ var=$(false)
$ echo $?
1
$

Однако маловероятно, что у вас установлен errexitв вашем.bashrc, и еще менее вероятно, что следующая команда проверит код выхода вашей команды, так что очень маловероятно, что это на что-то повлияет.

Сценарии запуска, такие как.bashrc, — это то место, где вы не хотите set -o errexit, потому что вы можете быть заблокированы из оболочки из-за простой опечатки или изменений, которые вы не контролируете. Чтобы обнаруживать, но не сбой из-за ошибок, вы можете, например, перехватывать их:

$ trap 'echo $?' ERR
$ var=$(false)
1
$

Это весьма полезно, например, в подсказке .

-2
31.07.2019, 20:53
2 ответа

Переменные не раскрываются внутри одинарных кавычек. Вам нужно заключить его в двойные кавычки:

ff() {
    find. -type f -name "$1"
}

Вы искали буквальную строку$1


Примечание. :Вы также должны указать свой аргумент командной строки, чтобы *не расширялось до имени файла в вашем pwd.

ff "*.so"

См.:Цитирование

2
28.01.2020, 05:14

Проблема в том, что вы используете одинарные кавычки вокруг '$1'в своем определении ff, поэтому на самом деле вы запускаете findдля поиска файла с буквальным именем $1.

Это можно исправить, используя вместо этого двойные кавычки:

ff() {
    find. -type f -name "$1"
}

У вас также есть проблема при вызове ff, поскольку вы передаете *.soбез кавычек, который будет расширен оболочкой, если в текущем каталоге есть файл с именем *.so.

Например, это не удастся:

mattr@kiva-mattr:~/src/protocol$ touch bogusname.so
mattr@kiva-mattr:~/src/protocol$ ff *.so

Он будет искать только bogusname.soи не сможет найти libindystrgpostgres.so.

Чтобы исправить это, вы должны использовать либо двойные, либо одинарные кавычки вокруг *.soпри вызове функции ff:

mattr@kiva-mattr:~/src/protocol$ ff '*.so'

Или, также верно:

mattr@kiva-mattr:~/src/protocol$ ff "*.so"
2
28.01.2020, 05:14

Теги

Похожие вопросы