2013-05-14 4 views
5

bash 맨 페이지를 읽을 때 .bashrc는 쉘이 대화식으로 실행될 때만 실행되어야합니다. 맨 페이지 정의로서 대화식 :ssh를 통해 명령을 실행하면 .bashrc도 실행됩니까?

대화식 쉘은 하나의 비 - 옵션 인수없이 및 그 표준 입력 에러 단자에 연결된 두 있다 -c 옵션없이 시작 (isatty 의해 측정을 (3)) , 또는 -i 옵션을 사용하여 을 시작한 경우 bash가 대화 형 일 경우 PS1이 설정되고 $ - i는 쉘 스크립트 또는 시작 파일이 상태를 테스트 할 수있게합니다.

그러나 ssh를 사용하여 명령을 실행하면 명령이 대화식으로 실행되지 않는다고 가정 할 때 .bashrc가 예상대로 실행되지 않습니다. 따라서이 동작은 버그처럼 보이지만 Red Hat의 모든 버전과 내가 시도한 배쉬에서 보입니다. 누군가이 행동이 올바른 이유를 설명 할 수 있습니까?

추가 포인트 : .bashrc를 실행해도과는 960376534와이 아닌 것처럼 설정됩니다 (예상했던대로).

$ grep USER /etc/passwd 
USER:x:UID:GID:UNAME:/home/USER:/bin/bash 

$ cat ~/.bashrc 
echo bashrc:$-,$PS1 

$ bash -c 'echo $-' 
hBc 

$ ssh localhost 'echo $-' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
hBc 

$ ssh localhost 'ps -ef | grep $$' </dev/null 2>/dev/null 
[email protected]'s password: 
bashrc:hBc, 
USER 28296 28295 0 10:04 ? 00:00:00 bash -c ps -ef | grep $$ 
USER 28297 28296 0 10:04 ? 00:00:00 ps -ef 
USER 28298 28296 0 10:04 ? 00:00:00 grep 28296 

나는 현재의 .bashrc에 [[ $- = *i* ]]을 테스트하여이 문제를 해결하고 있어요,하지만 난 그렇게 할 필요가 없습니다 것처럼 보인다. 나는에 시도했습니다 배쉬의

$ cat /etc/redhat-release 
Red Hat Enterprise Linux Server release 5.7 (Tikanga) 

$ bash --version 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 
Copyright (C) 2005 Free Software Foundation, Inc. 

버전 :

한 예를 들어, 서버, .bashrc에 (및 스푸핑)보다 내 홈 디렉토리에있는 다른 파일을 포함하지 않는 것은이 구성이 3.00.15를, 3.1.17, 3.2.25, 4.1.2 (Red Hat 6.3의 후자). Bash manual에서

+0

, 쉘은 아마도, 상호 작용하는 경우에도 로컬 컴퓨터하지만 사용자에게 대화 형으로 표시하지 않습니다. 원격 셸의 명령 줄 인수를 확인할 수 있습니까? –

+0

'.bash_profile'의 결과는 무엇입니까? 나는 단지'if [-f ~/.bashrc]와 같은 것을 찾고있다. . ~/.bashrc fi'로 로그인 할 때'.bashrc'를 활성화시킵니다. – Ewan

+0

@kisamoto :'.bash_profile'은 로그인 쉘에서만 실행됩니다. –

답변

3

:

배쉬는 원격 쉘 데몬, 일반적으로 rshd, 또는 보안 쉘 데몬에 의해 실행될 때와 같은 네트워크 연결에 연결된 표준 입력으로 실행되고있을 때 결정하기 위해 시도 sshd. Bash가이 방법으로 실행중인 것으로 판단하면 ~/.bashrc에서 명령을 읽고 실행합니다 (해당 파일이 존재하고 읽을 수있는 경우). sh로 호출하면이 작업을 수행하지 않습니다. --norc 옵션을 사용하면이 동작을 금지 할 수 있으며 --rcfile 옵션을 사용하여 다른 파일을 강제로 읽을 수는 있지만 rshd은 일반적으로 해당 옵션을 사용하여 셸을 호출하거나 지정할 수 없습니다.

기본 데비안 bashrc 골격의 해결 방법은 .bashrc의 상단에 다음과 같은 배치하는 것입니다 : 원격 시스템의 관점에서

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 
+0

이 부분은 맨페이지에 있습니다. 대화 형 셸에 사용되는 .bashrc에 대한 설명에 혼란 스러웠습니다. "~/.bashrc : 개별 대화 형 셸 시작 파일". –

관련 문제