(“super”) 쉘로 즉시 돌아 가지 않고 초기 명령으로 대화식 bash 서브 쉘을 실행하십시오. 명령을 열어서 작동하지만 원하는

bash 서브 쉘을 실행하고 싶고 (1) 몇 가지 명령을 실행 한 다음 (2) 원하는대로 서브 쉘에 남아 있습니다. 나는 이들 각각을 개별적으로 할 수 있습니다.

  1. -c플래그를 사용하여 명령을 실행하십시오 .

    $> bash -c "ls; pwd; <other commands...>"

    그러나 명령이 실행 된 후 즉시 “super”쉘로 돌아갑니다. 대화 형 서브 쉘을 실행할 수도 있습니다.

  2. bash프로세스를 시작하십시오 .

    $> bash

    명시 적으로 말할 때까지 서브 쉘을 종료하지 않지만 초기 명령을 실행할 수는 없습니다. 내가 찾은 가장 가까운 솔루션은 다음과 같습니다.

    $> bash -c "ls; pwd; <other commands>; exec bash"

    하나의 서브 쉘에서 주어진 명령을 실행 한 다음 상호 작용을 위해 별도의 명령을 열어서 작동하지만 원하는 방식은 아닙니다.

한 줄로하고 싶습니다. 일단 서브 쉘을 빠져 나가면 사고없이 일반 “슈퍼”쉘로 되돌아 가야합니다. 방법이 있어야합니다 ~~

NB : 내가 묻지 않은 것은 …

  1. bash 맨 페이지를 어디서 얻을 수 있는지 묻지 않습니다.
  2. 파일에서 초기화 명령을 읽는 방법을 묻지 않습니다 …이 작업을 수행하는 방법을 알고 있습니다. 원하는 솔루션이 아닙니다.
  3. tmux 또는 gnu 화면 사용에 관심이 없음
  4. 이에 대한 맥락에 관심이 없습니다. 즉, 질문은 일반적인 것으로 의도되며 특정 목적을위한 것이 아닙니다.
  5. 가능한 경우 원하는 것을 달성하지만 “더러운”방식으로 해결 방법을 사용하고 싶지 않습니다. 그냥 한 줄로하고 싶습니다. 특히 저는 다음과 같은 일을하고 싶지 않습니다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