
터미널에서 실행되는 명령에 새 런타임 플래그를 추가하는 방법을 알아내려고 합니다.
예를 들어. : 최근 Docker로 실험을 시작했는데 ID를 복사하여 붙여넣어 종료된 컨테이너를 정리하는 것이 지루하다는 것을 알았습니다. 런타임 clean
에 명령줄 옵션을 추가하고 싶습니다 docker
. 그러면 실행할 때 docker clean
(또는 docker --clean
그렇게 할 경우) docker 런타임(즉, docker rm $(docker ps -a -q -f status=exited)
) 에서 이미 지원하는 옵션을 사용하여 정리 명령을 실행하도록 내부적으로 매핑할 수 있습니다. 그러한 매핑을 구축하는 것이 가능합니까?
한 가지 옵션은 별칭을 사용하는 것이라는 것을 알고 있지만 별칭은 내가 아는 한 별칭 이름에 공백/명령줄 플래그를 허용하지 않습니다. 마찬가지로, 쉘 함수는 전체 기능을 무시하기 때문에 도움이 되지 않습니다(또는 아마도 제가 잘못하고 있는 것일 수도 있습니다). 나는 한동안 이 가능성을 탐구하고 싶었으므로 도움을 주시면 감사하겠습니다.
답변1
실행 파일과 동일한 이름으로 bash 함수를 정의하고 추가 매개변수를 처리하고 command
내장 기능을 사용하여 원래 함수를 명확하게 호출하도록 할 수 있습니다. 에서 man bash
:
command [-pVv] command [arg ...]
Run command with args suppressing the normal shell function
lookup. Only builtin commands or commands found in the PATH are
executed.
설명하자면,
function ls() {
case "$1" in
"foo") shift
echo "do new thing with remaining args: $@"
;;
*) command ls "$@"
;;
esac
}
그 다음에
$ ls -ltr --color=always
total 12
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:16 subdir1
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir2
drwxrwxr-x 2 steeldriver steeldriver 4096 Sep 17 08:17 subdir3
정상적으로 작동하지만
$ ls foo -ltr --color=always
do new thing with remaining args: -ltr --color=always
( 이것을 시도하려면 명령이 unalias
필요할 수 있습니다 ).ls
분명히 실제 구현에서는 적절한 오류 검사를 수행해야 합니다. 아마도 의 getopts
간단한 스위치/케이스 대신 전체 명령줄을 처리하는 데 사용할 수 있습니다 $1
.
대안으로(더 전통적으로) 다음을 작성하여 동일한 결과를 얻을 수 있습니다.래퍼 스크립트원래 실행 파일보다 먼저 나오는 위치 $PATH
(예: /usr/local/bin
또는 $HOME/bin
)에 배치합니다. 래퍼 내에서 절대 경로로 원본 실행 파일을 참조하세요.