포럼 게시물의 지침에 따라 외부 컴퓨터에 SSH를 통해 무언가를 설치할 때 아무 생각 없이 다음 명령을 실행했습니다.
. .bashrc
이전에 이 명령을 본 적이 없지만 ~/.bashrc
지금은 어떤 명령도 실행할 수 없기 때문에 (이전에 비슷한 문제가 있었기 때문에) 이 명령이 재귀적으로 소스가 된 것으로 추측합니다. 로그인하면 아무것도 할 수 없습니다. 즉시 나는 다음을 얻습니다.
-bash: /usr/bin/whoami: Argument list too long
-bash: /usr/bin/cut: Argument list too long
-bash: /usr/bin/logger: Argument list too long
불행하게도 과거에 비슷한 문제가 발생했을 때( ssh -t user@host /bin/sh
bash 쉘로 로그인하지 않고 실행 후 수정 ~/.bashrc
) 문제에 대한 해결책을 찾을 수 없었습니다. 왜냐하면 ~/.bashrc
... 이전과 똑같아 보였기 때문입니다. 엉망이되다.
내가 무엇을 하든 수정은 ~/.bashrc
해결책이 아닌 것 같습니다. 누구든지 대체 솔루션을 제안할 수 있습니까?
이것은 ~/.bashrc
:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog2:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/prog2:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/prog2/bin:$PATH
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog3/tools/newtool:$PATH
export PYTHONPATH=$PATH:$HOME/.local/bin:$HOME/prog2:$PYTHONPATH
답변1
. .bashrc
.bashrc
현재 쉘에서 실행될 내용입니다. 일반적으로 쉘이 시작될 때 이를 읽기 때문에 이 작업을 수행할 필요가 없지만 .bashrc
, 수정하고 다시 로드하려는 경우에는 수행할 수 있습니다.
그러나 대화형 셸에서 이 작업을 수행해도 나중에 로그인할 때 시작하는 다른 셸에는 영향을 주지 않습니다.
그런데 내용이 .bashrc
좀 이상합니다.
export PATH=$PATH:$HOME/.local/bin:$HOME/bin/prog1:$PATH
^^^^^ ^^^^^
$PATH
처음에 오래된 것을 어떻게 넣는지 주목하세요그리고새로운 엔딩 PATH
, 다섯 번의 다른 시간. 내 계산에 의하면 원본은 $PATH
32번 나올 것이다. 나쁘지는 않지만, 쉘이 시작될 때 이 작업을 수행했다면 $PATH
이제 수천 개의 문자를 갖게 되고, 동일한 작업을 다시 수행하면 아마도 100kB가 훨씬 넘을 것입니다. 74자 부터 시작하여 $PATH
이러한 할당을 두 번 실행하면 172kB 문자열이 생성됩니다.
이는 문제가 될 수 있습니다. Linux에는 단일 명령줄 인수 길이에 대한 제한이 128kB입니다(전체 명령줄 인수에 대한 제한 외에도). 환경 변수와 명령줄 인수는 에서 유사하게 전달되므로 execve()
아마도 두 가지 모두에 동일한 제한 사항이 적용될 것이므로 PATH
.
답변2
export
첫 번째 줄 세트를 이것으로 바꾸십시오.
export PATH="$PATH:$HOME/.local/bin:$HOME/bin"
[[ -d "$HOME/bin/prog1" ]] && PATH="$PATH:$HOME/bin/prog1"
[[ -d "$HOME/bin/prog2" ]] && PATH="$PATH:$HOME/bin/prog2"
[[ -d "$HOME/prog2" ]] && PATH="$PATH:$HOME/prog2"
[[ -d "$HOME/prog2/bin" ]] && PATH="$PATH:$HOME/prog2/bin"
[[ -d "$HOME/bin/prog3/tools/newtool" ]] && PATH="$PATH:$HOME/bin/prog3/tools/newtool"
무슨 일이 일어나고 있는지는 각 행에서 $PATH
두 배로 증가한다는 것입니다( $PATH
+새 항목 + ). $PATH
아주 이상한.
이 대체 코드에서 [[ ... ]]
이를 $PATH
.