대체 항목이 있는 별칭 표시

대체 항목이 있는 별칭 표시

별칭을 표시하는 방법이 있습니까?뒤쪽에배쉬가 교체됐나요?

배경:
디렉터리에서 작업을 수행하는 긴 별칭이 있습니다.

alias do_it='cd my_working_dir; do_stuff'

이것은 잘 작동하지만 별칭이 매우 길고 my_working_dir자주 변경됩니다. 모든 항목을 찾기 위해 별칭을 자세히 검색하는 대신 my_working_dir다음과 같이 변경했습니다.

MY_WORKING_DIR=some_dir
alias do_it='cd ${MY_WORKING_DIR}; do_stuff'

이것은 훌륭하게 작동합니다.

그러나 때때로 별칭을 즉석에서 약간 변경하고 싶을 때가 있습니다. 이전 별칭 구성에서는 를 입력하고 alias원하는 명령을 복사/붙여넣고 모드를 만들고 실행할 수 있었습니다 . 이 대체 항목을 사용하여 입력하면 다음과 같은 결과를 alias얻습니다.

do_it='cd ${MY_WORKING_DIR}; do_stuff'

이제 수동으로 교체해야 합니다 MY_WORKING_DIR. 별칭의 복사본을 얻을 수 있는 편리한 방법이 있습니까?뒤쪽에bash가 대체되었습니다(이 경우 ${MY_WORKING_DIR}.

밝히다: 내 목표는 별칭/함수의 입력을 변경하는 것이 아닙니다. 생성된 별칭/함수를 표시하고 싶습니다.이미 교체됨이렇게 하면 해당 출력을 복사/붙여넣어 더 복잡한 명령을 만들 수 있습니다. 대체된 별칭이나 함수를 표시하는 방법을 찾지 못했습니다.

추가 예시

TARGET_DIR='my_dir'    
alias do_it='cd ${TARGET_DIR}; run task; echo "Task done in ${TARGET_DIR}'
alias
do_it='cd ${TARGET_DIR}; run task; echo "Task done in ${TARGET_DIR}'

별칭을 50x 반복하려면 별칭 출력을 복사하여 다음 줄에 붙여넣으면 됩니다.

for i in {1..50}; do <paste_here>; done

alias그러나 출력 결과 ${TARGET_DIR}이 확인되지 않기 때문에 이는 작동하지 않습니다 .

별칭 대신 함수를 사용하는 것도 작동하지 않습니다. declare${TARGET_DIR}도 바꿀 수 없기 때문입니다.

이것은 단순화된 예입니다. 제가 사용한 실제 별칭은 길고 지루했습니다. ${TARGET_DIR}이 여러 번 나타났기 때문에 별칭/함수는 잘 작동했지만 별칭 출력을 더 복잡한 즉석 명령으로 결합하려면 ${를 수동으로 바꿔야 했습니다. TARGET_DIR}을 여러 번 실행했습니다.

답변1

내가 아는 한, 적어도 안전하고 보편적인 방식은 아닙니다. 이것은 또한 나에게 별칭을 사용하는 매우 이상한 방법처럼 보입니다.

쉘 스크립트가 더 적합하지 않을 것이라고 확신합니까? 물건을 착용하고 $PATH( $PATH필요한 경우 조정 가능) 이름 do_it을 지정하려면 매개변수가 필요할 수 있습니다.

또한 스크립트가 별칭과 동일한 작업을 수행하도록 하고 요청 시 대체 항목과 함께 별칭 명령을 표시할 수도 있습니다.


\원하는 것 이상으로 확장 하거나 이스케이프 문자를 잘못 처리하는 등의 위험이 있으므로 별칭 사용을 고집하는 경우 이는 매우 안전하지 않지만 다음과 같이 할 수 있습니다.

$ alias test='echo $UID'
$ alias xalias='f(){ eval echo $(echo $(alias "$@" | sed s,\'\'',\'\\\\\\\\\\\\\'',g ) ) ; unset -f f; }; f'
$ xalias test
alias test='echo 1000'

올바른 견적을 받는 것은 실망스러운 일이 될 수 있습니다. 이는 작은따옴표( '->) 를 인용한 \'다음 모든 것을 다시 인용 함으로써 수행됩니다 . 첫 번째 eval호출은 수준을 역참조하며, 이 시점에서 ${VAR}수준은 더 이상 참조되지 않으므로 평가됩니다. 그런 다음 echo문자열이 하위 쉘에서 평가되므로 백틱을 추가하십시오. 아마도 간접적인 양 때문에 이것을 좀 지나치게 복잡하게 만들고 있을 것입니다.

이는 여전히 취약하며 bash+sed는 해당 작업에 적합하지 않습니다.

답변2

가끔씩 작업 디렉터리를 변경하고 싶어하는 것 같으므로 디렉터리 경로 이름을 명령줄 인수로 사용할 수 있는 셸 함수로 별칭을 바꾸는 것이 좋습니다.

do_it () {
    local wd="${1:-my_working_dir}"
    cd "$wd" || return
    do_stuff
 }

이 함수는 선택적 단일 매개변수인 디렉토리 경로명을 사용합니다. 주어지면 함수의 지역 wd변수가 이 값으로 설정됩니다. 지정하지 않으면 지역 wd변수가 정적 문자열로 설정됩니다 my_working_dir.

약간만 변경하면 사용자가 예상치 못한 작업 디렉터리에 있는 것을 방지하는 기능을 비활성화할 수 있습니다.

do_it () {
    local wd="${1:-my_working_dir}"
    (
        cd "$wd" || return
        do_stuff
    )
 }

cd함수 내에서 괄호로 묶인 하위 쉘 환경(수정될 수 있는 현재 작업 디렉토리 포함 )은 호출 쉘의 환경에 영향을 주지 않습니다.

일반적으로 별칭을 선언하는 위치에서 이 함수를 선언하고 다음과 같이 사용할 수 있습니다.

do_it

아니면 논쟁이 있군요.

do_it some/directory/path

또는 여러 디렉터리 경로 이름에서 실행하는 루프에서

for target_dir in some/pattern/dir*/
do
    do_it "$target_dir"
done

답변3

다음은 다음의 사본입니다.

Bash에서 별칭을 인라인으로 확장하는 방법은 무엇입니까?

그리고

실행 전에 서브셸을 확장하시겠습니까?

BASH는 이 문제를 처리하기 위해 readline을 사용하는 것으로 나타났습니다. 그다음 누르시면 됩니다 Esc-Ctrle

테스트를 위해 .bash_profile에 다음 별칭을 정의했습니다.

alias cdh='cd ${HOME}'

새 셸/터미널을 시작하면 다음을 입력할 수 있습니다.

cdh

그런 다음 다음을 누르십시오. Esc Ctrl-e

readline은 명령줄을 다음과 같이 업데이트합니다.

cd /home/user_name 

MacOS 13.2.1
iterm2 3.4.15
bash 5.1.8(1)-릴리스(x86_64-apple-darwin21.2.0)

Ubuntu 20.04.5 LTS
5.0.17(1)-릴리스(x86_64-pc-linux-gnu)

관련 정보