두 개의 별칭이 있습니다(분명히 가려져 있음).
alias ki='kinit -kt ~/.keytab alexdodd@box'
alias pt='function _pritunl() {/Applications/Pritunl.app/Contents/Resources/pritunl-client start 0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX$1; echo attempting pritunl login };_pritunl'
나는 순진하게도 그것들을 서로 연결하여 다음과 같이 차례로 실행할 수 있다고 생각했습니다.
alias ptki='function _ptki() {
pt $1
ki
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}'
그러나 인수 $1은 별칭 pt로 전달되지 않습니다(구문 분석 오류 발생)`, 제가 바보라는 건 알지만 여기에 뭔가가 빠졌습니다. 검색을 시도했지만 우리가 너무 기본적인 것 같아서 무엇인지 잘 모르겠습니다. 내가 찾고 있어요 .
분명히 나는 bash 스크립트를 건드린 적이 없습니다 =/내가 배워야 할 것들의 긴 목록에 추가하기
별칭 "ptki"를 사용하여 세 개의 별칭을 순서대로 실행하고 싶습니다. ptki는 매개변수를 가져와서 전달해야 합니다.
첫 번째는 인수를 수락하고 이를 별칭에 전달합니다. 두 번째는 첫 번째 것 이후 10초를 기다려야 합니다. 세 번째는 DEV_STACK_NAME이 존재할 때만 실행됩니다.
답변1
첫째, 가독성과 유지 관리 용이성 때문에 함수 정의에서 별칭을 "단축키"로 사용하지 않는 것이 좋으며, 다른 곳에 정의된 별칭을 사용하여 자신의 방식대로 진행하지 않는 것이 좋습니다. 원래 다른 의도를 가진 함수나 스크립트로 구현되었음을 기억하거나 심지어 아는 것입니다.
둘째, 스크립트/함수에서 별칭을 사용해야 하는 경우 bash
맨페이지에서는 비대화형 셸(예: 스크립트)에서는 별칭이 확장되지 않는다는 점을 알려줍니다. 그 안에서 확장하려면 스크립트 내에서 실행되도록 이러한 별칭(일반적 으로 또는 ) 을 정의하는 파일 shopt -s expand_aliases
과 스크립트를 추가해야 합니다. 나에게는 스크립트 내에서 소싱하는 것이 어떤 경우에도 최적이 아닙니다. 주로 주어진 호스트 시스템에 무엇이 있는지 항상 알 수 없기 때문입니다. 기본적으로 스크립트 내에서 셸 별칭을 호출할 수 있으려면 다음이 필요합니다.source
~/.bashrc
~/.bash_aliases
~/.bashrc
~/.bashrc
누구나BASH_ENV
호출 bash 쉘 환경에서 환경 변수를 정의합니다.또는#!/usr/bin/bash -i
스크립트에서 shebang으로 사용됩니다. man bash
스크립트 셸을 대화형으로 만드는 방법에 대한 섹션을 보고 찾으세요 .BASH_ENV
하지만(다시) 이는 좋은 습관에 위배되며 조만간 귀하 또는 다른 사람이 스크립트에서 별칭을 허위로 사용하여 문제를 겪게 될 것임을 의미합니다. 대신 기능을 사용해 보세요.
따라서 보여드린 작은 코드의 내용을 다루지 않고 호출된 스크립트에서 수행해야 하는 방식은 my_script
기본적으로 다음과 같습니다.
#!/usr/bin/bash
function _pritunl() {
/Applications/Pritunl.app/Contents/Resources/pritunl-client start \
0e7e534335bsdfds6eaeb8e023a5ce4 --password XXXX"$1"
echo "attempting pritunl login"
}
function _ptki() {
_pritunl "$1"
kinit -kt ~/.keytab alexdodd@box
if [ "$DEV_STACK_NAME" -ne 1 ]; then
echo "Starting devstack"
devstack start
fi
}
_ptki "$1"
.. 그런 다음 스크립트( my_script
)를 실행 가능하게 만들고 실행하거나 직접 실행합니다.
$ bash my_script first_arg
이는 스크립트의 첫 번째 위치 매개변수 first_arg
에 해당합니다 .$1
위의 스크립트에는 문제가 있으며 목록의 첫 번째 것은 @roaima가 OP의 설명에서 지적한 것입니다. 이는 아마도 문제를 해결하는 올바른 방법이 아닐 것입니다. 하지만그렇다면다음이 필요하다는 것을 기억하세요: