비 대화식 쉘 확장 별명


12

다음과 같은 명령을 실행할 때 호스팅 계정에서 별칭을 확장하는 데 문제가 있습니다.

ssh user@server "bash -c \"alias\""

내 .bashrc 파일은 다음과 같습니다

echo .bashrc
# .bashrc

shopt -s expand_aliases

# Source global definitions (commenting this out does nothing)
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# User specific aliases and functions
alias php="php55"
alias composer="php ~/bin/composer.phar"

위의 ssh 명령을 실행하면 ".bashrc"echo'd가 표시됩니다. 그러나 별칭을 실행하려고하면 아무것도 얻지 못합니다.

"bash -ic"을 시도 할 수 있지만 실제로는 쉽게 변경할 수없는 스크립트에 있으며 이것이 왜 작동하지 않는지 알고 싶습니다.

출력 ssh user@server "bash -c \"shopt\""

.bashrc
autocd          off
cdable_vars     off
cdspell         off
checkhash       off
checkjobs       off
checkwinsize    off
cmdhist         on
compat31        off
compat32        off
compat40        off
dirspell        off
dotglob         off
execfail        off
expand_aliases  off
extdebug        off
extglob         off
extquote        on
failglob        off
force_fignore   on
globstar        off
gnu_errfmt      off
histappend      off
histreedit      off
histverify      off
hostcomplete    on
huponexit       off
interactive_comments    on
lithist         off
login_shell     off
mailwarn        off
no_empty_cmd_completion off
nocaseglob      off
nocasematch     off
nullglob        off
progcomp        on
promptvars      on
restricted_shell        off
shift_verbose   off
sourcepath      on
xpg_echo        off

출력 ssh user@server "bash -c \"echo $SHELL\""

.bashrc
/bin/bash

~ / bin에서 별명으로 원하는 것과 동일한 작업을 수행하는 심볼릭 링크와 스크립트를 포기했습니다. 언제 까지나 내를 수출로 $PATH~/bin:$PATH는 잘 작동합니다.
Matt

당신이있는 경우 (확실히 16.04 및 최신) 우분투에 ~/.local/bin이 때 /etc/profile자동으로 PATH에 있음을 추가합니다 처리됩니다. 또한 단지 할 수 . /etc/profile있는 폴더를 생성 한 후에는 재부팅 또는 로그 아웃 / 로그인없이 PATH에 추가하세요.
dragon788

답변:


15

로부터 bash(1)매뉴얼 페이지

expand_aliases 쉘 옵션이 shopt를 사용하여 설정되지 않는 한 쉘이 대화식이 아닌 경우 별명은 확장되지 않습니다 (아래의 SHELL BUILTIN COMMANDS에서 shopt에 대한 설명 참조).


5
내가해야합니까 shopt -s expand_aliases내 .bashrc에에,하지만 작동하지 않습니다. 왜 그런지 잘 모르겠지만 이것이 정답
Matt

@Matt 나는 '이벤트'의 순서를 잘 모르겠지만 별칭 앞에 shopt -s expand_aliases당신이 있는지 확인하려고 했 .bashrc습니까? 확실히, 질문에 대한 귀하의 결과는 expand_aliases입니다 off.
크림슨 백로

예, 내 질문에서 .bashrc를 참조하십시오. 에코 라인을 볼 수 있지만 shopt꺼져 있습니다. 어쩌면 이것을 막는 이상한 서버 설정이있을 수 있습니다. 해결 방법이 있습니다
Matt

아마도 .bashrc파일은 기본적으로 공급되지 않고 있었다.
Daniel Farrell

8

SSH로 원격으로 명령을 실행할 때 얻는 쉘은 대화식 쉘이나 로그인 쉘이 아닙니다.

$ ssh server 'bash -c "echo $-"'
chsB

( 응답 i에는 없습니다 l.)

Bash의 경우 일반적인 초기화 파일을 읽지 않습니다.

당신은 추가하여 로그인 쉘을로 원격 쉘을 강제 할 수 -l는의 첫 번째 구문 분석한다고하는 수단 배시 호출에 ~/.bash_profile, ~/.bash_login그리고 ~/.profile, 그것을 찾을 수 순서에서 검색 있지만 ~/.bashrc. 즉, 대신 해당 파일 중 하나에 별칭을 넣어야합니다.


이것은 해결책처럼 들립니다. 나는이 서버를 더 이상 사용하지 않아서 테스트 할 수는 없지만 누군가 다른 사람이 질문을 찾은 경우 이것을 피할 가치가 있습니다.
Matt

2

나는 같은 문제가 있었고 처음 shopt -s expand_aliases에는 도움이되지 않는 것 같습니다. 내가 찾은 것은 실제 별명을 추가하기 전에이 옵션을 설정해야한다는 것입니다. 따라서 옵션을 .bashrc설정 하기 전에 별칭을 만들면 expand_aliases사용할 수 없습니다. 따라서 옵션을 설정 한 후 별명을로드 (또는 다시로드)해야합니다.


0

bash (1) 말한다

...

로그인 쉘이 아닌 대화식 쉘이 시작되면 bash는 ~ / .bashrc에서 해당 파일이있는 경우 명령을 읽고 실행합니다.

...

대화식 쉘은 비 옵션 인수와 표준 입력 및 오류가 모두 isatty (3)에 의해 결정된 터미널에 연결되거나 -i 옵션으로 시작되는 -c 옵션없이 시작되는 쉘입니다.

따라서 .bashrc를 수동으로 소싱하거나 -i를 사용하여 실행하십시오.

별칭이 모두 필요한 경우 예를 들어 .aliases에서 분리 한 다음 .bashrc와 스크립트에서 소스를 생성하는 것이 좋습니다.


.bashrc가 소스임을 알 수 있습니다. 명령을 실행할 때 .bashrc에서 에코 라인이 보입니다. 문제는 해당 파일의 별칭이 확장되지 않는다는 것입니다.
매트

0

다음을 입력하여 문제를 해결할 수 있습니다.

if [ -f /etc/skel/.bashrc ]; then . /etc/skel/.bashrc; fi

첫 줄에.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.