rm
파일이 먼저 복사된 /tmp/recycle_bin
다음 명령이 실행될 때 삭제되도록 rm 명령에 대한 별칭을 만듭니다 . 그런데 도중에 문제가 생겼습니다.
내가 수행한 단계:
~/.bashrc
파일에 다음 명령을 작성했습니다 .alias rm='cp $@ /tmp/recycle_bin && rm $@'
다음 명령을 사용하여 실행하십시오.
. ~/.bashrc
새 터미널을 열고 다음 명령을 실행합니다.
rm "/home/XXXXX/My_Programs/test_method.py" cp: missing destination file operand after '/tmp/recycle_bin'** got this error message
알 필요가있다:
매개변수도 삭제하려는 파일로 rm 명령에 전달됩니다. **다음 이후에 대상 파일 피연산자가 누락되었습니다.라는 오류가 발생하는 이유는 무엇입니까
/tmp/recycle_bin
?별칭 명령의 변수가
$@
채워지지 않았습니까? 이 상황을 디버깅하고 해결하는 방법은 무엇입니까?
답변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
위의 원래 명령줄에서 만들어 보겠습니다.