Расширение Bash: разные результаты при запуске файла или в терминале // extglob - PullRequest
1 голос
/ 04 июля 2019

В некоторых скриптах я хочу использовать имена папок внутри текущей папки. Я хочу получить имена папок, и здесь я приведу только проблемную часть. Если я запускаю это из терминала, я получаю:

$ for D in */; do echo ${D%%+(/)} ; done
galaxya8
iphone6s
motog6
motog7

$ echo ${0}
/bin/bash

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)

Однако, если я помещаю это в файл и запускаю файл, я получаю имена с косой чертой:

$ echo 'for D in */; do echo ${D%%+(/)} ; done' >> test.sh

$ bash test.sh
galaxya8/
iphone6s/
motog6/
motog7/

Я видел это расширение bash здесь . Что мне не хватает? Может быть, какое-то значение по умолчанию только для интерактивных оболочек?


Минимальный, полный и проверяемый пример (Спасибо @ kamil-cuk):

$ D=a/; echo ${D%%+(/)}; bash <<<'D=a/; echo ${D%%+(/)}'
a
a/

1 Ответ

5 голосов
/ 04 июля 2019

Из руководства bash :

Если опция оболочки extglob включена с помощью встроенной функции shopt, распознаются несколько расширенных операторов сопоставления с образцом. ...

+ (шаблон)
Соответствует одному или нескольким вхождениям данных шаблонов.

Вам необходимо включить опцию extglob shopt в вашем скрипте, чтобы использовать расширенный оператор сопоставления с образцом +(/).

echo 'shopt -s extglob; for D in */; do echo ${D%%+(/)} ; done' > test.sh
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...