별칭을 표시하는 방법이 있습니까?뒤쪽에배쉬가 교체됐나요?
배경:
디렉터리에서 작업을 수행하는 긴 별칭이 있습니다.
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)