다음을 수행하기 위해 bash 별칭을 만들려고 합니다.
- 폴더 만들기(현재 날짜를 폴더 이름으로 사용)
- 현재 폴더에서 새 폴더로 파일을 이동(또는 복사)합니다.
파일 이름은 별칭에 변수로 전달됩니다. 예를 들어,my-alias file.txt
다음은 제가 시도한 몇 가지 사항입니다(더 많은 변형을 시도했지만).
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 './$(date +%F)-List/$1' && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 ./$(date +%F)-List/$1 && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cd '$(date +%F)-List' && cp ../$1 ./$1"
명령을 작성하는 여러 가지 방법을 시도했지만 그 중 아무 것도 작동하지 않습니다.
나는 무엇을 보고 있는 걸까?
이는 Mac 운영 체제에 있으며 대부분의 다른 Linux 환경과 동일해야 합니다.
업데이트: 내가 어디서 잘못됐나요?
내가 어디에서 혼란스러워하는지 깨달았습니다. 나는 매개변수를 받는 것처럼 보이는 많은 별칭을 설정했습니다. 나는 오래 전에 (몇 년 전) 그것들을 설정했습니다. 별칭은 명령줄에 입력할 때 뒤에 오는 모든 것을 처리할 수 있기 때문에 별칭은 인수만 허용하는 것 같다는 것을 이제 깨달았습니다. 그러나 별칭이 참조하는 명령 문자열 끝에 있는 "인수"만 동일한 순서로 처리합니다. 따라서 별칭 명령 문자열의 매개변수 조정을 시작하자마자 별칭이 중단됩니다. 그렇습니다. 가장 좋은 방법은 기능을 사용하는 것입니다.
답변1
별칭을 사용해야 하는 경우 -t를 사용하여 이동할 파일의 실제 인수 앞에 대상 디렉터리를 지정할 수 있습니다.
alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"
Linux에서 작동하지만 테스트할 MacOS 시스템이 없습니다.
답변2
별칭 대신 함수를 사용하세요. 별칭을 사용하는 데 문제가 있는 경우 거의 항상 이것이 답입니다. 특히 $1
별칭은 실제로 매개변수를 허용하지 않으므로 매개변수(예: )를 사용하려고 하는 경우 더욱 그렇습니다 .
또한 매개변수 및 변수 참조 주위에는 거의 항상 큰따옴표를 넣어야 합니다(예: "$1"
뿐만 아니라 $1
). 그리고 date
다른 결과를 얻을 가능성이 있으므로 여러 번 실행하지 마십시오 . 한 번 실행하고 결과를 변수에 저장하십시오. 이 시도:
my-function() {
local subdir="$(date +%F)-List"
mkdir -v -p "$subdir" &&
cp "$1" "$subdir/$1" &&
cd "$subdir"
}
답변3
다른 질문에 대한 답변에서 알 수 있듯이 별칭은 매개변수를 잘 처리하지 못합니다. 다음을 볼 수도 있습니다.
param=foo; do something with "$param"
매개변수가 작동하는 방식은 다음과 같습니다. 먼저 매개변수를 설정하고(시간 및 명령줄에서) 사용합니다. 이것의 반대:
<alias string with several commands to be expanded> <parameter>
이 매개변수는 별칭의 마지막 명령 매개변수일 수 있습니다. 그것은 당신에게 필요한 것이 아닙니다.
셸의 관점에서 별칭을 단일 명령으로 작성하여 별칭을 사용하여 이 작업을 수행할 수 있지만 이것이 유용한 접근 방식인지는 의문입니다.
alias testalias='bash -c "echo \$1; echo \$1-" bash'
$ testalias foo
foo
foo-
이에 대한 한 가지 주장은 인용이 복잡하다는 것입니다. 심지어 이런 실수는 내가 먼저 했다.
답변4
함수를 생성해야 합니다. mkdir -v -p '$(date +%F)-List'
별칭을 생성할 때만 평가됩니다.