저는 LINUX(ubuntu 14)를 사용하고 있는데 새로 구입한 랩탑에서는 셸을 사용해야 했습니다 . 이전에는 C-셸을 사용했고 별칭을 bash
에서 ..bashrc
.cshrc
.bashrc
그러나 한 가지 작동하지 않는 것은 지연 논쟁입니다. 예를 들어 - 내 .cshrc
명령은 다음과 같습니다.
alias rm 'mv -f \!* $HOME/zap'
.bshrc에 다음과 같이 작성하면
alias rm = 'mv -f \!* $HOME/zap'
오류 메시지 생성:
bash:alias: rm: not found
bash:alias: mv -f \!* $HOME/zap: not found
(이 디렉토리는 zap
제가 미리 만들어 놓은 것입니다.)
대신 무엇을 사용해야 합니까 \!*
?
답변1
이러한 경우 별칭 대신 셸 함수를 사용해야 합니다. 더 많은 타이핑이 필요하지만 더 많은 유연성을 제공합니다.
function rm {
if ! test -d "$HOME/zap"; then
echo "No zap in home" >&2
return 1
else
mv -f -- "$@" "$HOME/zap/"
fi
}
명령줄에 $@
제공한 인수 로 확장됩니다. 명령줄 플래그의 끝을 알리는 것이 필요합니다( rm
파일 이 어디에 있는지, 가능 하고 많은 명령줄 플래그가 어쨌든 공유되지 않도록).--
rm -f
-f
rm
mv
원래 명령에 액세스하려면 또는 를 rm
사용하십시오 .\rm
command rm
존재 여부를 테스트하고 $HOME/zap
, 표준 오류에 오류 메시지를 인쇄하고, 함수에서 0이 아닌 종료 상태로 종료하는 것은 원하는 것은 무엇이든 할 수 있다는 것을 보여줍니다. 분명히 이것을 다음과 같이 단순화할 수 있습니다.
function rm {
mv -f -- "$@" "$HOME/zap/"
}
매뉴얼 bash
에는 다음과 같은 내용이 포함되어 있습니다.
거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다.
ls
별칭은 좋아하는 로고 등을 태그하는 경우에만 유용합니다 .
답변2
불필요한 공백을 제거하면 이 명령이 작동하기를 바랍니다.
$ alias rm='mv -f \!* $HOME/zap'
파일을 이동하지 않고 무슨 일이 일어나는지 "확인"하기 위해 에코를 추가해 보겠습니다.
$ alias rm='echo mv -f \!* $HOME/zap'
$ rm one two three
mv -f !* /home/immf/zap one two three
csh
이는 csh가 사용하는 것처럼 bash 기록이 기록 명령과 다르게 작동한다는 것을 보여줍니다 .
별칭에 기록 참조가 포함되어 있으면 원래 명령이 이전 입력 행이었던 것처럼 기록 대체가 수행됩니다.
Bash에서는 그렇지 않습니다. 더 중요한 것은 bash 별칭에는 다음과 같은 제한 사항이 있다는 것입니다.
대체 텍스트에 매개변수를 사용하는 메커니즘은 없습니다. 매개변수가 필요한 경우 쉘 함수를 사용해야 합니다.
쉘이 대화형이 아닌 경우 별칭은 확장되지 않습니다.
즉, 현재 줄의 매개변수는 재사용할 수 없으며 별칭은 (기본적으로) 스크립트에 영향을 미치지 않습니다.
그러나 별칭의 목적은 동일한 매개 변수를 재사용하고 마지막 디렉터리를 파일 이동 대상으로 추가하는 것입니다.
$ alias rm 'echo mv -f \!* $HOME/zap' ### in csh
$ rm one two 333 ### in csh
mv -f one two 333 /home/user/zap
이는 -t
다음 옵션을 사용하여 쉽게 수행 할 수 있습니다 mv
(bsd에서는 사용할 수 없음 mv
):
$ alias rm='echo mv -f -t "$HOME/zap"'
$ rm one two 333
mv -f -t /home/user/zap one two 333
즉, 기능을 사용하는 것이 현명합니다.