command_string에서 별칭을 사용하는 방법은 무엇입니까?

command_string에서 별칭을 사용하는 방법은 무엇입니까?

일반적으로 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)

관련 정보