별칭에 대한 작은따옴표 내의 명령 대체

별칭에 대한 작은따옴표 내의 명령 대체

bash에서는 명령 대체를 위해 큰따옴표가 필요합니다.

$ echo "$(date)"
Fri Oct 28 19:16:40 EDT 2016

작은따옴표는 명령 대체를 수행하지 않습니다.

$ echo '$(date)'
$(date)

alias… 그렇다면 명령 대체가 작은따옴표로 발생했음을 암시하는 다음 동작이 표시되는 이유는 무엇입니까 ?

alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
   ....

답변1

작은따옴표와 큰따옴표 버전

작은따옴표를 사용하여 별칭을 정의해 보겠습니다.

$ alias d='$(date)'

이제 별칭의 정의를 검색해 보겠습니다.

$ alias d
alias d='$(date)'

아직 명령 대체가 수행되지 않았음을 확인하세요.

똑같이 해보겠습니다. 단, 이번에는 큰따옴표를 사용합니다.

$ alias d="$(date)"
$ alias d
alias d='Fri Oct 28 17:01:12 PDT 2016'

큰따옴표가 사용되었기 때문에 별칭이 정의되기 전에 명령 대체가 수행되었습니다.

작은따옴표 버전

작은따옴표 버전을 실행해 보겠습니다.

$ alias d='$(date)'
$ d
bash: Fri: command not found

작은따옴표 버전은 다음을 실행하는 것과 동일합니다.

$ $(date)
bash: Fri: command not found

두 경우 모두 명령이 실행될 때 명령 대체가 수행됩니다.

변형

명령 대체를 사용하고 작은따옴표를 사용하여 정의되는 다음 별칭을 고려해 보겠습니다.

$ alias e='echo $(date)'
$ e
Fri Oct 28 17:05:29 PDT 2016
$ e
Fri Oct 28 17:05:35 PDT 2016

이 명령을 실행할 때마다 date다시 평가됩니다. 작은따옴표를 사용하면 별칭이 정의될 때가 아니라 별칭이 실행될 때 명령 대체가 수행됩니다.

답변2

별칭을 정의할 때 큰따옴표를 사용하면 매개변수 확장이 다음 위치에서 발생합니다.별칭 정의시간.

예를 들어:

$ pwd
/tmp
$ echo $PWD
/tmp
$ alias p="echo $PWD"
$ p
/tmp
$ cd /
$ pwd
/
$ p
/tmp
$ alias p
alias p='echo /tmp'
$ 

매개변수 확장이 발생하는 시점에 발생하도록 하려면부르다별칭을 정의할 때 작은따옴표를 사용하세요.

$ alias p='echo $PWD'
$ p
/tmp
$ cd /
$ p
/
$ 

물론 절대 없습니다어느명령을 실행하는 이유 echo "$(date)". 나는 당신이 이것을 단지 예로서 사용했다는 것을 알고 있지만 이것을 "야생에서" 여러 번 보았으므로 어쨌든 명확하게 설명하겠습니다. 이것이 의미하는 바는 명령을 실행 date하고 출력을 캡처합니다(후행 개행 문자 제거). 그런 다음 캡처된 출력을 명령에 대한 인수로 전달하면 echo단일 후행 개행과 함께 인쇄됩니다. 직접 실행하는 것보다 전혀 이점이 없습니다 date.

그러나 여기서도 다른 문제가 있습니다.

별칭을 설정하면 명령줄에 입력한 리터럴 결과를 얻게 됩니다 . d='$(date)'즉 , 명령이 실행되고 출력이 캡처되며 후행 줄 바꿈이 제거된 다음 출력이 명령으로 구문 분석됩니다. 쉘(단어 분할 및 파일 글로브 확장 포함).d$(date)date

금요일이기 때문에 출력된 첫 번째 단어 date는 "Fri"이므로 쉘은 이를 명령으로 실행하려고 시도합니다.

당신이 원하는 것이 있다면보다을 입력할 때 날짜를 입력하려면 d다음을 사용하세요.

alias d=date

또는

alias d='date'

또는

alias d="date"

어떠한 형태의 인용이 필요한 특수 문자도 없기 때문에 어떤 형태를 사용하는지는 중요하지 않습니다.

답변3

그 일이 진행되고 있습니까 ~/.bashrc? 에 주석이 달린 부분이 있습니다.~/.bashrc

    95 # Alias definitions.                                              
    96 # You may want to put all your additions into a separate file like
    97 # ~/.bash_aliases, instead of adding them here directly.          
    98 # See /usr/share/doc/bash-doc/examples in the bash-doc package.   

이것이 바로 제가 바로가기용으로 추천하는 또 다른 파일을 사용하는 이유입니다.

그만큼~/.bash_aliases

핵심은 작은따옴표를 이스케이프 처리하는 것입니다.

# I use vim but nano or gedit is also fine
vim ~/.bashrc # or vim ~/.bash_aliases
# create your alias:
alias d=''\'date''\'
# or
alias dd="'date'"
# or
alias ddd='"date"'

그런 다음 새 터미널 세션을 열고 d원하는 것을 실행합니다.

관련 정보