Сценарий Bash :Избегайте добавления одинарных кавычек в строку

AutoFS может быть решением см. больше в этом руководствеhttps://www.howtoforge.com/accessing_windows_or_samba_shares_using_autofs

Или добавьте sudoers mount для cif и предоставьте пользователям возможность самостоятельно монтировать свои собственные файлы с помощью шейдерных кредитов.https://askubuntu.com/questions/67405/auto-mounting-network-shares-per-user

0
18.11.2021, 20:04
3 ответа

Ваша проблема в том, что вы добавляете двойные кавычки к тексту, выводимому git diff. Это искажает пути и еще больше затрудняет правильный анализ списка файлов, особенно если какое-либо имя пути содержит кавычки.

Одинарные кавычки, которые вы видите в выводе трассировки, просто добавлены bash, чтобы было проще увидеть, как разграничиваются строки (, например. чтобы показать, что "test, file.php"и "testfile.php"являются тремя отдельными аргументами ). Помните, что вывод трассировки оболочки — это вывод отладки, предназначенный для того, чтобы дать вам подсказку о том, что делает оболочка, и обычно фактический код, выполняемый оболочкой, не является .


Чтобы безопасно использовать пути, которые выводит git diff --name-only, рассмотрите возможность использования опции -z. Это приводит к тому, что gitвыводит имена путей в виде списка с нулевыми -разделителями. Затем вы можете использовать xargs -0для выполнения любой команды над элементами этого списка:

git diff --name-only -z --diff-filter=AM develop... |
xargs -0./bin/phpcs

Вы также можете прочитать список файлов в массив. Например, в оболочке bash:

readarray -d '' -t names < <( git diff --name-only -z --diff-filter=AM develop... )

./bin/phpcs "${names[@]}"

Очевидно, это зависит от git diffтого, что не выводится слишком много имен .

3
18.11.2021, 20:28

Если вы можете гарантировать, что ваши имена файлов не содержат символы новой строки, вы можете использовать их для разграничения имен файлов и помещения их в массив:

OIFS=$IFS IFS=$'\n'
files=( $(git diff --name-only --diff-filter=AM develop...) )
IFS=$OIFS

Теперь вы можете интерполировать массив как список строк в кавычках:

./bin/phpcs "${files[@]}"

Это не работает на POSIX shили dash. Вам нужно использовать оболочку, такую ​​​​как bash, которая поддерживает массивы

.
2
18.11.2021, 20:17

Одинарные кавычки не добавляются. bash -xпросто показывает, какие буквальные аргументы видны. Поскольку $OUTPUTне цитируется, разбиение слов действует на пробелы и новые строки. "являются частью переменной и не имеют отношения к синтаксическому анализу оболочки.

Вы могли бы сделать это:

eval./bin/phpcs $OUTPUT

Подход roaima с использованием массивов выглядит лучше.

1
18.11.2021, 20:27

Теги

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