.bashrc의 "별칭"에 매개변수 연기

.bashrc의 "별칭"에 매개변수 연기

저는 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-frmmv

원래 명령에 액세스하려면 또는 를 rm사용하십시오 .\rmcommand 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

즉, 기능을 사용하는 것이 현명합니다.

관련 정보