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
원하는 것을 실행합니다.