Bash config file выдает ошибки при получении из скрипта Perl - PullRequest
2 голосов
/ 28 марта 2019

Получил строку perl, которая вызывает функцию оболочки bash после того, как она получит .bash_profile

system ('source ~/.bash_profile; osascript -e \'quit app "Chromium"\'');

Хотя функция оболочки вызывается и выполняется отлично, яполучение ошибки из несвязанной функции bash:

/Users/me/.bashrc: line 9: syntax error near unexpected token `<'
/Users/me/.bashrc: line 9: `  done < <(find -L "$1" -type f -not -name *.swp -print0 | LC_COLLATE=C sort -dz)'

Это проблемная функция в файле .bashrc:

source_dir() {
  while IFS= read -r -d $'\0' file; do
    source_file "$file"
  done < <(find -L "$1" -type f -not -name *.swp -print0 | LC_COLLATE=C sort -dz)
}

Эта функция bash не выдает ошибок при поискенапрямую, только при загрузке через скрипт Perl.Мне любопытно узнать почему.

Я использую bash версии 5.0.2.

1 Ответ

6 голосов
/ 28 марта 2019

perl's system использует /bin/sh в качестве оболочки (https://perldoc.perl.org/functions/system.html).. Он не будет понимать синтаксис, специфичный для bash, такой как подстановки процессов.

Вы захотите явно вызвать bash:

system 'bash', '-c', q{source ~/.bash_profile; osascript -e 'quit app "Chromium"'};

Использование механизма одиночных кавычек q{}, чтобы избежать обратной косой черты.


Примечание bash: если вы вызываете его как интерактивную оболочку, он автоматически выпадает из bashrcтак что вы должны быть в состоянии сделать:

system 'bash', '-ic', q{osascript -e 'quit app "Chromium"'};

ref: https://www.gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files

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