대화형 bash 하위 쉘에서 PS1을 쉽게 변경

대화형 bash 하위 쉘에서 PS1을 쉽게 변경

더 긴 프로세스 동안 사용자에게 하위 쉘을 제공해야 하는 상황이 있습니다. 사용자에게 특수 하위 쉘에 있고 나머지 프로세스를 완료하지 않았음을 알리도록 프롬프트를 변경하고 싶습니다. 이렇게 하면 내가 원하는 것을 얻을 수 있을 거라 생각했는데...

echo "PS1='foo:'" | bash -i

하지만 줄을 입력하면 이것이 내가 얻는 출력입니다.

me@mercury:~$ PS1='foo:'
foo:exit
me@mercury:~$ 

이 문제를 해결하는 쉬운 방법이 있나요? 나만의 사용자 정의 bashrc를 작성할 수 있지만 사용자의 일반적인 bash-shell 설정을 유지하는 것을 선호합니다.

답변1

bash -i프로세스 대체를 사용하면 다음과 같이 호출될 때만 존재하는 ~/.bashrc를 기본적으로 생성할 수 있습니다 .

 bash --rcfile <(echo "PS1='foo: '") -i

답변2

~/.bashrc여전히 읽고 싶지 않고 ~/.bashrc설정되지 않았다고 가정하려면 $PROMPT_COMMAND다음 트릭을 사용할 수 있습니다.

PROMPT_COMMAND='PS1="foo: ";unset PROMPT_COMMAND' bash

rc 파일이 설정된 경우에도 다른 접근 방식이 작동하며 $PS1다음 $PROMPT_COMMAND과 같이 (zsh/bash/ksh93 셸에서) 수행할 수 있습니다.

(
  export IN_FD
  exec {IN_FD}<&0
  echo 'PS1="foo: "; exec <&"$IN_FD" {IN_FD}<&-' | bash -i
)

PS1="foo: "이는 파이핑 입력이며, 이는 bashstdin을 원시 stdin으로 전환하도록 지시합니다.

이는 stderr에 프롬프트와 명령줄을 표시하는 부작용이 있습니다. 다음을 사용하여 문제를 해결할 수 있습니다.

(
  export IN_FD ERR_FD
  exec {IN_FD}<&0 {ERR_FD}>&2 2> /dev/null
  echo 'PS1="foo: "; exec <&"$IN_FD" {IN_FD}<&- 2>&"$ERR_FD" {ERR_FD}>&-' |
    bash -i
)

하지만 이는 시작 파일에서 출력되는 오류 메시지(있는 경우)를 숨기는 부작용이 있습니다.

답변3

env PS1="foo: " /bin/bash --norc -i내 생각에는 이 옵션을 사용하는 것이 더 좋을 것 같습니다 --rcfile. 환경은 도트 파일로 덮어쓰지 않고 보존되며 PS1 환경 변수는 쉘에 들어가기 전에 설정됩니다.

호출 프로그램이 추가 권한을 제공하는 경우 제한된 셸을 여는 것을 고려할 수도 있습니다. env PS1="foo: " PATH=$RESTRICTED_PATH /bin/rbash --norc -i원하는 $RESTRICTED_PATH 값에 대해.

또는 미리 만들어진 bashrc 파일이 있습니다.

if [ -f /etc/bashrc ]; then
    source /etc/bashrc
fi
if [ -f ~/.bashrc ]; then
    source ~/.bashrc
fi
PS1="foo:"
PATH=$RESTRICTED_PATH

그럼 전화해/bin/bash -rcfile ~/.bashrc.appsubshell -i

답변4

SiegeX에 동의합니다(그는 나보다 한발 앞서 있었습니다 :))

이 동작을 설명하십시오.

Bash는 표준 입력 및 출력이 일반 터미널인 경우에만 대화형 모드로 시작됩니다. 파이프라인에 초기 명령을 입력하는 경우에는 그렇지 않습니다.

-c옵션을 사용하여 명령을 제공할 수 있지만 대화형 모드도 제외됩니다.

정말로 사용자 rc를 유지하려면 rcfile 문자열에 일부 테스트/소스 문을 소스에 추가하고 ~/.bashrc파일 /etc/bashrc이 존재하는지 확인하세요.

관련 정보