Bash에서 여러 줄 별칭을 만드는 방법은 무엇입니까?

Bash에서 여러 줄 별칭을 만드는 방법은 무엇입니까?

더 빠르게 호출하기 위해 여러 줄 명령에 대한 별칭을 만들고 싶습니다.복사-붙여넣기-실행텍스트 파일에서 나올 때마다.

그러한 명령의 예는 다음과 같습니다.원격 업데이트 절차 실행주문하다:

(
cd "${program_to_update_dir}"
wget https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh
source update.sh
rm update.sh
)

몇 년 전에 나는 Bash 디자인 제한으로 인해 여러 줄 명령의 앨리어싱이 불가능하다는 것을 배웠습니다. 하지만 그 이후로 프로그램이 변경되어 이제는 가능합니다.


여전히 가능하지 않다면 해당 코드로 함수를 생성하고 모든 셸 세션으로 내보낸 다음(하위 세션을 거의 사용하지 않지만 마지막으로 이 작업을 수행한 것이 기억나지 않습니다), Somehow를 호출할 수 있을 것이라고 생각했습니다. .

적절하고 안전한 곳에 포장했다면 exported로 포장하세요명명된 함수필요할 때 말하거나 .bashrc전화 를 하시겠습니까?.bash_profile

답변1

이것은 불가능하지 않습니다.

alias thing='(
cd "${program_to_update_dir}"
wget "https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh"
source update.sh
rm update.sh
)'

또는,

alias thing='( cd "${program_to_update_dir}"; wget "https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh"; source update.sh; rm update.sh )'

별칭의 문제점은 이를 올바르게 참조하기가 어렵다는 것입니다.텍스트 문자열, 그리고 그들은에 더 적합합니다정말 짧다그림

alias ls='ls -F'

거의 모든 경우에는 쉘 함수가 필요합니다.

thing () (
    cd "${program_to_update_dir}"
    wget 'https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh'
    source update.sh
    rm update.sh
)

또는 update.sh현재 디렉터리의 이름을 사용하지 않고(관련되지 않은 파일에서 사용할 수 있음) 성공 시에만 wget실행 cd하고 bash셸을 약간 단순화하도록 수정되었습니다.

thing () (
    cd "$program_to_update_dir" &&
    source <( wget --quiet -O - 'https://raw.githubusercontent.com/USER/PROJECT/BRANCH/update.sh' )
)

( 스크립트를 실행하거나 로 파이프 하거나 -line에서 사용하는 인터프리터를 사용하는 대신 update.sh사용 하고 싶을 수도 있습니다 . 이를 사용하고 있다는 사실은 혼란스럽습니다. 서브쉘이 종료되면 스크립트가 실행되는 환경 (보통 사람들이 스크립트를 원하는 이유)이 손실됩니다.bashbash -s#!sourcesourcesource

셸 함수는 별칭이 정의된 동일한 초기화 파일에서 정의될 수 있으며 별칭과 동일한 방식으로 사용되지만 더 일반적입니다(매개변수 등을 허용할 수 있음).

설명서에는 bash다음 내용이 포함되어 있습니다.

거의 모든 목적에서 별칭은 쉘 함수로 대체됩니다.

관련 정보