최근에 다음과 같이 사용자 정의 별칭을 활성화할 수 있다는 것을 알게 되었습니다 sudo
.
alias sudo='sudo ' # note: the space is required!
이것이 작동하는 이유다음과 같이:
별칭 값의 마지막 문자가 공백이나 탭인 경우 별칭 뒤의 다음 명령 단어도 별칭 확장을 확인합니다.
sudo
내 질문은: 사용자 정의 기능도 활성화할 수 있는 방법이 있습니까 ?
답변1
일반적인 경우에는 수행하려는 작업이 실제로 작동하지 않습니다.
별칭을 사용하면 실행 라인을 전달하기 전에 문자열을 다시 작성하는 것이 거의 중요합니다.
예를 들어, 다음과 같은 경우
alias sudo='sudo '
alias foo='bar baz'
sudo foo
그런 다음 명령줄을 입력하면 다음 sudo bar baz
과 같이 다시 작성됩니다.저것그 다음에는 실행 중인 작업이 있습니다. 이것은 간단한 명령줄 재작성입니다.
이제 기능이 더 어려워졌습니다. 이는 단순한 재작성이 아니라 완전한 평가를 수행하며 변수를 설정하고, 디렉토리를 변경하고, 파일을 열 수 있습니다.아무것쉘이 트릭을 수행할 것입니다. 그리고 중요한 것은 현재 셸의 컨텍스트 내에서 실행된다는 것입니다. 을 실행할 때 sudo myfunction
이 중 어느 것도 가능하지 않습니다 . 특히 sudo
명령은 하위 프로세스로 실행되므로 현재 쉘에 영향을 미치지 않습니다.
위의 문제를 해결하는 데 사용되는 솔루션은 sudowrap
자동으로 계산을 시도하는 것입니다 sudo bash -c 'myfunction() {...} ; myfunction'
. 이는 명시적으로 새 bash
하위 쉘을 호출한 다음 해당 하위 쉘에서 함수를 실행합니다. 명시적인 호출을 통해 변수 설정과 같은 작업이 작동하지 않음이 분명해집니다. :-) 기능의 제한된 하위 집합을 허용합니다.
이 방법으로 호출할 수 있는 함수 유형은 sudo
그냥 호출할 수 있는 함수보다는 쉘 스크립트로 다시 작성하는 것이 더 좋습니다. 주어진 예는http://w00tbl0g.blogspot.com/2007/05/using-bash-functions-under-sudo.htmlduk
실행 파일로 변환하는 것이 더 쉬울 것입니다.
#!/bin/bash
exec du -k "$@" | sort -n
그러면 예상대로 작동할 것입니다!