当源于Perl脚本时,Bash配置文件引发错误
获取了一行perl代码,它在发出当源于Perl脚本时,Bash配置文件引发错误,bash,perl,Bash,Perl,获取了一行perl代码,它在发出.bash\u profile system('source~/.bash\u profile;osascript-e'退出应用程序“Chromium\”) 尽管包装器函数被调用并执行得非常好,但我从一个无关的bash函数中抛出了一个错误: /Users/me/.bashrc: line 9: syntax error near unexpected token `<' /Users/me/.bashrc: line 9: ` done < <
.bash\u profile
system('source~/.bash\u profile;osascript-e'退出应用程序“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)'
这个bash函数在直接寻源时不会抛出错误,只有在通过Perl脚本加载时才会抛出错误。我很想知道为什么
我正在运行bash 5.0.2版。perl的系统使用/bin/sh
作为shell()。它不会理解特定于bash的语法,比如进程替换
您需要显式调用bash:
system 'bash', '-c', q{source ~/.bash_profile; osascript -e 'quit app "Chromium"'};
使用q{}
单引号机制来避免反斜杠
bash注意事项:如果将其作为交互式shell调用,它会自动在bashrc中运行,因此您应该能够执行以下操作:
system 'bash', '-ic', q{osascript -e 'quit app "Chromium"'};
ref:oscript不重要。它只是系统“osascript”命令的bash包装器。它正在被呼叫并按预期工作。谢谢。这暴露了我的一个盲点。我不确定sh
和bash
之间到底有什么区别。这有帮助:@StevieD,但请检查ls-l/bin/sh
;通常情况下,/bin/sh
只是指向另一个shell的链接,这通常是bash
。然而,我发现调用sh
(例如从终端调用)会有所不同——可能它不运行初始化,即使它确实运行bash
。在这种情况下,这就是为什么explicitbash
(通常应该做的事情)解决了您的问题。在Mac上,/bin/sh
转到Mach-O 64位可执行x86_64
我一直认为它们也是一样的。我上面提供的链接指出了不同之处。@zdim使用sh
调用bash使其在中运行。不过,它确实读取启动文件。
system 'bash', '-ic', q{osascript -e 'quit app "Chromium"'};