더 긴 프로세스 동안 사용자에게 하위 쉘을 제공해야 하는 상황이 있습니다. 사용자에게 특수 하위 쉘에 있고 나머지 프로세스를 완료하지 않았음을 알리도록 프롬프트를 변경하고 싶습니다. 이렇게 하면 내가 원하는 것을 얻을 수 있을 거라 생각했는데...
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: "
이는 파이핑 입력이며, 이는 bash
stdin을 원시 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
이 존재하는지 확인하세요.