Подстановка команд работает в командной строке, но не в скрипте


Используя ubuntu 10.10 у меня есть следующее, что я запускаю в командной строке:

result="$(ls -d !(*.*))"
chmod +x $result

Это возвращает список файлов, которые не имеют расширений и делает их исполняемыми.

Но когда я перемещаю его в файл скрипта (оболочку), он не работает. Из того, что я прочитал на форуме, это что-то связанное с заменой команд, выполняемой в другой подложке.

Но я пока не смог найти решение, которое работает в моем scrpt : (

Итак, как вы получаете результат команда и сохранить ее в переменной внутри скрипта?

1 2

1 ответ:

(поскольку @user000001, по-видимому, не записывает свой комментарий в ответ, я буду заниматься написанием ответа. Так что надо отдать им должное.)

Функция, которую вы используете, является функцией extglob (Расширенное глобирование) bash. Это значение по умолчанию включено для интерактивных оболочек и по умолчанию отключено для неинтерактивных оболочек (т. е. скриптов оболочки). Чтобы включить его, используйте команду shopt -s extglob.

Обратите внимание, что эта команда действует только для строк ниже это:
shopt -s extglob
ls -d !(*.*)

Это не влияет на разбор одной и той же строки:

shopt -s extglob; ls -d !(*.*)   # won't work!!

Вообще хочу предостеречь об использовании таких особенностей bash. Это делает код довольно непереносимым. Я бы предложил вместо этого использовать функции и инструменты POSIX, которые позволяют довольно легко переносить код на другую платформу, а также представляют собой определенное подмножество возможностей, которые больше понимают разработчики, не обращаясь сначала к документации.

То, чего вы хотите достичь, также может быть быть сделано с помощью find. Это также имеет то преимущество, что не вызывает проблем в сочетании со странными именами файлов (например, содержащими пробелы, кавычки и т. д.):

find . -maxdepth 1 -type f -name '*.*' -o -exec chmod +x "{}" \;