在交互式bash shell下运行系统命令

Håk*_*and 5 bash perl

我正在尝试~/.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)

Tom*_*ech 6

-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)