2014-12-20 4 views
5

system 명령을 사용하여 Perl에서 내 ~/.bashrc에 별명이 지정된 명령을 실행하려고합니다. 이 명령은 한 번만 실행되지만 두 번 실행하면 두 번째 호출이 백그라운드 작업으로 실행 된 다음 일시 중단됩니다 (<CTRL-Z>과 동일). 명령을 완료하려면 fg을 입력해야합니다. 예 :대화식 bash 쉘에서 시스템 명령 실행

두 번째 호출이 완료되지 않습니다. 출력은 [1]+ Stopped a.pl입니다.

주의 : 다른 명령 my_cmd 교체시

  • 동일한 결과가 예 ls 대해 얻어진다.
  • ~/.bashrc 파일의 내용에 의존하지 않는 것 같습니다. 나는 그것에서 모든 것을 제거하려고 노력했고, 문제는 여전히 지속되었다.

저는 Ubuntu 14.04 및 Perl 버전 5.18.2를 사용하고 있습니다.

system ('bash -lc "my_cmd"'); 
system ('bash -lc "my_cmd"'); 
:

업데이트 디버깅을위한

나는 나의 ~/.bashrc

echo "Entering ~/.bashrc .." 
alias my_cmd="ls" 
alias 

~/.bash_profile

if [ -f ~/.bashrc ]; then 
    echo "Entering ~/.bash_profile .." 
    . ~/.bashrc 
fi 

에 지금 실행 감소

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 

system ('bash -ic "my_cmd"'); 
system ('bash -ic "my_cmd"'); 

실행주는 대화 형 쉘의 -i 스위치를 사용하는 것보다 오히려

Entering ~/.bashrc .. 
alias my_cmd='ls' 
a.pl p.sh 

[1]+ Stopped     a.pl 

답변

6

을 제공합니다, 당신은 -l (또는 --login)를 사용한다고 생각합니다 스위치를 사용하면 bash가 로그인 쉘로 호출 된 것처럼 작동합니다.

-l 스위치를 사용하면 기본적으로 ~/.bashrc이로드되지 않습니다. man bash에 따르면 로그인 셸에서 /etc/profile/이로드되고 그 다음에 첫 번째 파일 인 ~/.bash_profile/, ~/.bash_login 또는 ~/.profile/이로드됩니다. 필자의 시스템에서는 ~/.bash_profile에 다음과 같은, 그래서 ~/.bashrc이로드됩니다

# Source .bashrc 
if [ -f ~/.bashrc ]; then 
    . ~/.bashrc 
fi 

는 이제 ~/.bashrc가로드되고 있는지, 당신이 아닌 대화 형 쉘에서 꺼져 별칭의 확장을 활성화해야합니다.이렇게하려면, 당신은 당신의 별칭을 설정하기 전에 다음 줄을 추가 할 수 있습니다

shopt -s expand_aliases 
+1

작동 중 !! 그레이트 :) –

1

무작위로 중지 프로세스 - 그것은 STDIN을 필요로하지만 연결이없는 경우 ctrl-z을 제외하고는 보통이다.

시도해보십시오 (예 : passwd &). 그것은 배경이되고 "멈춘"상태로 직행 할 것입니다. 이것은 bash 명령으로 일어날 수 있습니다. -i은 대화 형 셸을 명시 적으로 의미하므로 대화 형이 아닌 대화 형 셸을 사용하려고합니다.

거의 확실하게 최선의 방법은 아닙니다. 아마 다른 것을하고 싶을 것입니다. bash --login 님은 내가 관심있는 항목에 더 가깝습니다.

0

Tom Fenech의 답변이 나를 위해 우분투 16.04.1 LTS에서 조금 더 추가되었습니다. 내 ~/.bashrc 파일의 맨 위에서 다음 섹션을 주석 처리 했으므로 쉘이 대화 형 쉘 (예 : 로그인 쉘)이 아닌 경우 ~/.bashrc는 여전히 읽혀집니다. 다른 Linux 버전에서는이 섹션이 표시되지 않습니다.

# If not running interactively, don't do anything 
case $- in 
    *i*) ;; 
     *) return;; 
esac 
관련 문제