bash 서브 쉘을 실행하고 싶고 (1) 몇 가지 명령을 실행 한 다음 (2) 원하는대로 서브 쉘에 남아 있습니다. 나는 이들 각각을 개별적으로 할 수 있습니다.
-
-c
플래그를 사용하여 명령을 실행하십시오 .$> bash -c "ls; pwd; <other commands...>"
그러나 명령이 실행 된 후 즉시 “super”쉘로 돌아갑니다. 대화 형 서브 쉘을 실행할 수도 있습니다.
-
새
bash
프로세스를 시작하십시오 .$> bash
명시 적으로 말할 때까지 서브 쉘을 종료하지 않지만 초기 명령을 실행할 수는 없습니다. 내가 찾은 가장 가까운 솔루션은 다음과 같습니다.
$> bash -c "ls; pwd; <other commands>; exec bash"
하나의 서브 쉘에서 주어진 명령을 실행 한 다음 상호 작용을 위해 별도의 명령을 열어서 작동하지만 원하는 방식은 아닙니다.
한 줄로하고 싶습니다. 일단 서브 쉘을 빠져 나가면 사고없이 일반 “슈퍼”쉘로 되돌아 가야합니다. 방법이 있어야합니다 ~~
NB : 내가 묻지 않은 것은 …
- bash 맨 페이지를 어디서 얻을 수 있는지 묻지 않습니다.
- 파일에서 초기화 명령을 읽는 방법을 묻지 않습니다 …이 작업을 수행하는 방법을 알고 있습니다. 원하는 솔루션이 아닙니다.
- tmux 또는 gnu 화면 사용에 관심이 없음
- 이에 대한 맥락에 관심이 없습니다. 즉, 질문은 일반적인 것으로 의도되며 특정 목적을위한 것이 아닙니다.
- 가능한 경우 원하는 것을 달성하지만 “더러운”방식으로 해결 방법을 사용하고 싶지 않습니다. 그냥 한 줄로하고 싶습니다. 특히 저는 다음과 같은 일을하고 싶지 않습니다
xterm -e 'ls'
답변
임시 명명 된 파이프를 사용 하여 쉽게 수행 할 수 있습니다 .
bash --init-file <(echo "ls; pwd")
이 답변에 대한 크레딧은 Lie Ryan 의 의견입니다 . 나는 이것이 실제로 유용하다는 것을 알았고 주석에서 눈에 띄지 않기 때문에 그것이 자신의 대답이어야한다고 생각했습니다.
답변
임시 파일을 사용하여 로터리 방식 으로이 작업을 수행 할 수 있지만 두 줄이 필요합니다.
echo "ls; pwd" > initfile
bash --init-file initfile
답변
대신 이것을 시도하십시오 :
$> bash -c "ls;pwd;other commands;$SHELL"
$SHELL
대화식 모드에서 셸을 열고로 닫기를 기다 exit
립니다.
답변
내가 언급 한 “예상 솔루션”은 Expect 프로그래밍 언어로 bash 쉘을 프로그래밍하는 것입니다 .
#!/usr/bin/env expect
set init_commands [lindex $argv 0]
set bash_prompt {\$ $} ;# adjust to suit your own prompt
spawn bash
expect -re $bash_prompt {send -- "$init_commands\r"}
interact
puts "exiting subshell"
다음과 같이 실행하십시오. ./subshell.exp "ls; pwd"
답변
네이티브 서브 쉘을 사용하지 않는 이유는 무엇입니까?
$ ( ls; pwd; exec $BASH; )
bar foo howdy
/tmp/hello/
bash-4.4$
bash-4.4$ exit
$
명령을 괄호로 묶으면 bash가 하위 프로세스를 생성하여 이러한 명령을 실행할 수 있으므로, 예를 들어 부모 셸에 영향을주지 않고 환경을 변경할 수 있습니다. 이것은 기본적으로보다 읽기 쉽다 bash -c "ls; pwd; exec $BASH"
.
그래도 장황하게 보이면 두 가지 옵션이 있습니다. 하나는이 스 니펫을 함수로 사용하는 것입니다.
$ run() { ( eval "$@"; exec $BASH; ) }
$ run 'ls; pwd;'
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$ run 'ls;' 'pwd;'
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$
다른 하나는 exec $BASH
더 짧게 만드는 것입니다 .
$ R() { exec $BASH; }
$ ( ls; pwd; R )
bar foo howdy
/tmp/hello/
bash-4.4$ exit
$
R
탈출 문자열로 연주 할 필요가 없으므로 개인적으로 접근 방식이 더 좋습니다.
답변
경우 sudo -E bash
작동하지 않습니다, 나는 지금까지 내 기대를 충족 다음을 사용 :
sudo HOME=$HOME bash --rcfile $HOME/.bashrc
새 세션에 일부 시스템에서 기본적으로 발생하는 루트 HOME이 아닌 HOME을 사용자의 HOME으로 설정하기 때문에 HOME = $ HOME을 설정했습니다.
답변
보다 우아 --init-file
하지만 아마도 더 유용합니다.
fn(){
echo 'hello from exported function'
}
while read -a commands
do
eval ${commands[@]}
done