Избегайте распространения аргументов командной строки при поиске сценария bash - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть bash скрипт a.sh, который выглядит так:

#!/bin/bash
echo $#
echo $1

и скрипт b.sh, который выглядит так:

#!/bin/bash
source ./a.sh

Если я позвоню ./a.sh Я правильно получаю 0 и пустую строку в качестве вывода. При вызове ./a.sh blabla я получаю 1 и blabla в качестве вывода.

Однако, когда я вызываю ./b.sh blabla, я также получаю 1 и blabla в качестве вывода, даже если аргумент a.sh не был передан из в b.sh.

Похоже, это связано с использованием source (которое я должен использовать, поскольку в моем реальном случае использования a.sh экспортирует некоторые переменные). Как я могу избежать распространения аргументов b.sh на a.sh? Я думал об использовании eval $(a.sh), но это делает мои echo операторы в a.sh неудачными. Я думал об использовании shift для получения аргументов из b.sh перед вызовом a.sh, но я не обязательно знаю, сколько существует аргументов.

1 Ответ

1 голос
/ 08 апреля 2020

Проблема root - это аномалия в работе команды source. Из справочной страницы bash в разделе «Команды встроенной оболочки»:

. имя файла [ аргументы ]
источник имя файла [ аргументы ]
[...] Если есть аргументы предоставляются, они становятся позиционными параметрами при выполнении filename . В противном случае позиционные параметры не изменяются.

... что означает, что вы можете переопределить аргументы основного скрипта, предоставив разные аргументы скрипту source d, но вы не можете просто не передайте аргументы ему.

К счастью, есть обходной путь; просто source скрипт в контексте, где нет аргументов:

#!/bin/bash
wrapperfunction() {
    source ./a.sh
}
wrapperfunction

Поскольку аргументы для wrapperfunction не передаются, в нем список аргументов пуст. Поскольку команды a.sh выполняются в этом контексте, список аргументов там также пуст. И переменные, назначенные внутри a.sh, доступны вне функции (если они не объявлены как local или что-то подобное).

(Примечание: я проверял это в bash, zsh, da sh, и ksh93, и он работает во всех них - хорошо, за исключением того, что da sh не имеет команды source, поэтому вы должны использовать ..)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...