Подстановка команд работает в командной строке, но не в скрипте
Используя ubuntu 10.10 у меня есть следующее, что я запускаю в командной строке:
result="$(ls -d !(*.*))"
chmod +x $result
Это возвращает список файлов, которые не имеют расширений и делает их исполняемыми.
Но когда я перемещаю его в файл скрипта (оболочку), он не работает. Из того, что я прочитал на форуме, это что-то связанное с заменой команд, выполняемой в другой подложке.Но я пока не смог найти решение, которое работает в моем scrpt : (
Итак, как вы получаете результат команда и сохранить ее в переменной внутри скрипта?
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 "{}" \;