rm 명령에 대한 별칭 만들기

rm 명령에 대한 별칭 만들기

rm파일이 먼저 복사된 /tmp/recycle_bin다음 명령이 실행될 때 삭제되도록 rm 명령에 대한 별칭을 만듭니다 . 그런데 도중에 문제가 생겼습니다.

내가 수행한 단계:

  1. ~/.bashrc파일에 다음 명령을 작성했습니다 .

    alias rm='cp $@ /tmp/recycle_bin && rm $@'
    
  2. 다음 명령을 사용하여 실행하십시오.

    . ~/.bashrc
    
  3. 새 터미널을 열고 다음 명령을 실행합니다.

    rm "/home/XXXXX/My_Programs/test_method.py"
    cp: missing destination file operand after '/tmp/recycle_bin'** got this error message 
    

알 필요가있다:

  1. 매개변수도 삭제하려는 파일로 rm 명령에 전달됩니다. **다음 이후에 대상 파일 피연산자가 누락되었습니다.라는 오류가 발생하는 이유는 무엇입니까 /tmp/recycle_bin?

  2. 별칭 명령의 변수가 $@채워지지 않았습니까? 이 상황을 디버깅하고 해결하는 방법은 무엇입니까?

답변1

별칭은 $@매개변수를 허용할 수 없으며 이를 사용하여 이와 같이 매개변수에 액세스할 수 없습니다.

별칭 확장은 bash간단한 텍스트 교체입니다. 있는 경우 alias rm ='something something'다음을 사용하여 rm file1 file2실행됩니다.

something something file1 file2

별칭이 포함된 경우 $@명령줄 인수로 확장됩니다.껍데기, 별칭이 아닙니다.

귀하의 경우 쉘의 명령줄 인수 목록이 비어 있다고 가정하면 별칭은

alias rm='cp $@ /tmp/recycle_bin && rm $@'

다음과 같이 실행됩니다.

cp /tmp/recycle_bin && rm file1 file2

rm file1 file2. 으로 호출되면 cp유틸리티는 피연산자가 하나만 있다고 불평합니다.


대신 쉘 함수를 사용할 수 있습니다.

rm () {
    cp -- "$@" "${TMPDIR:-/tmp}/recycle_bin" &&
    command rm -- "$@"
}

지정된 파일을 복사한 다음 $TMPDIR/recycle_bin( 설정되지 않았거나 비어 /tmp/recycle_bin있는 경우 TMPDIR) 해당 파일을 삭제합니다. 이 command명령은 무한 재귀를 발생시키지 않기 위해 사용됩니다. 모든 매개변수는 --옵션이 아닌 파일 이름으로 처리되어야 합니다 . 또한 파일 이름이 공백으로 분할되지 않고 인수의 파일 이름 글로빙 패턴이 원하는 파일을 선택하지 않도록 따옴표가 중요합니다.아니요삭제하고 싶습니다.

좀 더 효율적입니다( cp+ rm== mv):

rm () {
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

조금 더 안전합니다. (존재하지 않는 경우 휴지통을 만드세요):

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

GNU를 사용하는 것이 훨씬 더 안전합니다 mv(이름 충돌이 발생하면 휴지통에 백업을 만듭니다).

rm () {
    mkdir -p "${TMPDIR:-/tmp}/recycle_bin" &&
    mv -b -- "$@" "${TMPDIR:-/tmp}/recycle_bin"
}

별칭 전용(및 GNU 전용) 변형에 대해서는 "함수를 사용하지 않고 휴지통 기능 만들기".

답변2

Bash 및 대부분의 Bourne 파생 쉘은 매개변수화된 별칭을 지원하지 않습니다.

이런 일은 할 수 없습니다.

작업하는 한 가지 방법은 do를 확장하는 별칭을 정의하는 것입니다.

sh -c 'cp -- "$@" /tmp/recycle_bin && rm -- "$@"' sh

그러면 다음 명령이 생성됩니다.

myrm='sh -c '\''cp -- "$@" /tmp/recycle_bin && rm -- "$@"'\'' sh'

최신 버전의 Bourne Shell(bosh)을 사용하는 경우 새 쉘 프로세스를 생성하는 오버헤드 없이 이 작업을 수행할 수 있습니다. 셸에는 dosh호출 내에서 한 줄 스크립트처럼 작동하는 내장 명령이 포함되어 있습니다 sh -c. 매개변수화 가능한 별칭 개념은 1980년 전직 AT&T 직원에 의해 고안되었으며 UNOS.

이를 통해 다음을 bosh사용할 수 있습니다.

myrm='dosh '\''cp -- "$@" /tmp/recycle_bin && rm -- "$@"'\'' myrm'

참고: Bourne Shell은 원시 모드에서 별칭 명령을 입력하고 작은따옴표 문자에 필요한 이스케이프 시퀀스를 자동으로 생성하는 데 도움을 줄 수 있습니다. 이 추악한 명령줄을 직접 이스케이프하여 작성하는 대신 bosh위의 원래 명령줄에서 만들어 보겠습니다.

관련 정보