일반적으로 ll 별칭이 다음으로 설정된 .bashrc 파일이 있습니다.
alias ll='ls -l'
수동으로 호출하면 ll
잘 작동합니다. 그러나 때로는 문자열에서 명령을 실행해야 할 수도 있습니다. 그래서 나는 다음을 실행하고 싶습니다.
COMMAND="ll"
bash --login -c "$COMMAND"
불행하게도 이는 ll 명령을 찾을 수 없다고 불평하고 실패합니다. 이 범위에 실제로 정의되어 있는지 확인하면 다음과 같이 확인됩니다.
COMMAND="alias"
bash --login -c "$COMMAND"
위에서 언급한 내용은 모든 별칭을 올바르게 인쇄합니다.
bash의 -c command_string 매개변수와 함께 별칭 명령을 사용하는 방법이 있습니까?
답변1
여기서 주목해야 할 몇 가지 사항 중 첫 번째는 --login
옵션을 사용한 실행에 관한 것입니다.
When bash is invoked as an interactive login shell, or as a non-inter‐
active shell with the --login option, it first reads and executes com‐
mands from the file /etc/profile, if that file exists. After reading
that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile,
in that order, and reads and executes commands from the first one that
exists and is readable.
따라서 이 명령은 을 읽지 않습니다 .bashrc
. 둘째, 별칭은 대화형 셸에서만 작동하므로 별칭을 얻더라도 명령에서는 작동하지 않습니다. 그러나 이 함수는 비대화형 셸에서 작동할 수 있습니다. 따라서 별칭을 함수로 변환하고 위의 중 하나로 소스를 지정해야 합니다 ~/.bash_profile
.
또는 현재 환경에 정의된 함수를 상속된 함수로 내보낼 수 있습니다 bash -c
. 나는 이 기능을 가지고 있습니다 :
adrian@adrian:~$ type fn
fn is a function
fn ()
{
find . -name "$1"
}
다음과 같이 서브셸에서 호출할 수 있습니다.
adrian@adrian:~$ export -f fn
adrian@adrian:~$ bash -c "fn foo*"
./foo.bar
답변2
.bashrc
특정 조건에서만 읽으므로 다음을 수행하십시오.
$ cat ~/.bashrc
echo being read
alias foo='echo bar'
$ bash -c foo
bash: foo: command not found
$ bash -i -c foo
being read
bar
$
빨리 살펴보세요. bash(1)
나타날 interactive
수도 있습니다.
Aliases are not expanded when the shell is not interactive, unless the
expand_aliases shell option is set using shopt (see the description of
shopt under SHELL BUILTIN COMMANDS below).
-i
매개변수 목록을 입력하는 것 외에도 이를 달성하기 위한 여러 가지 다른 방법을 제공할 수 있습니다.
(즉, 비대화형 쉘에서는 별칭을 사용하지 않을 것입니다. 예를 들어 bash -c
)