我正在尝试~/.bashrc使用该system命令运行一个在Perl中使用别名的命令.它运行命令只运行一次,但是当我运行它两次时,第二次调用作为后台作业运行然后暂停(与按下相同<CTRL-Z>),我必须键入fg以完成命令.例如
use strict;
use warnings;
system ('bash -ic "my_cmd"');
system ('bash -ic "my_cmd"');
Run Code Online (Sandbox Code Playgroud)
第二个呼叫永远不会完成.输出是[1]+ Stopped a.pl.
注意:
my_cmd例如,当用任何其他命令替换时获得相同的结果ls.~/.bashrc文件的内容.我试图从中删除所有内容,问题仍然存在.我使用的是Ubuntu 14.04和Perl版本5.18.2.
更新
为了调试我减少了我~/.bashrc的
echo "Entering ~/.bashrc .."
alias my_cmd="ls"
alias
Run Code Online (Sandbox Code Playgroud)
和我~/.bash_profile的
if [ -f ~/.bashrc ]; then
echo "Entering ~/.bash_profile .."
. ~/.bashrc
fi
Run Code Online (Sandbox Code Playgroud)
现在运行:
system ('bash -lc "my_cmd"');
system ('bash -lc "my_cmd"');
Run Code Online (Sandbox Code Playgroud)
给
Entering ~/.bash_profile ..
Entering ~/.bashrc ..
alias my_cmd='ls'
bash: my_cmd: command not found
Entering ~/.bash_profile ..
Entering ~/.bashrc ..
alias my_cmd='ls'
bash: my_cmd: command not found
Run Code Online (Sandbox Code Playgroud)
并运行
system ('bash -ic "my_cmd"');
system ('bash -ic "my_cmd"');
Run Code Online (Sandbox Code Playgroud)
给
Entering ~/.bashrc ..
alias my_cmd='ls'
a.pl p.sh
[1]+ Stopped a.pl
Run Code Online (Sandbox Code Playgroud)
-i我认为您应该使用-l(或--login)开关,而不是将交换机用于交互式shell,这会导致bash的行为就好像它已被作为登录shell调用一样.
默认情况下,-l不使用交换机加载~/.bashrc.根据man bash,在登录shell中,/etc/profile/加载,然后是从中找到的第一个文件 ~/.bash_profile/,~/.bash_login或~/.profile/.在我的系统上,我有以下内容~/.bash_profile,因此~/.bashrc加载:
# Source .bashrc
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Run Code Online (Sandbox Code Playgroud)
现在您~/.bashrc正在加载,您需要启用别名的扩展,这在非交互式shell中是关闭的.为此,您可以在设置别名之前添加以下行:
shopt -s expand_aliases
Run Code Online (Sandbox Code Playgroud)