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
그러면 예상대로 작동할 것입니다!