예를 들어, 내가 가지고 있는
alias dbmigrate='rails db:migrate'
쉘에 입력할 때 Bash 및 Zsh에서 이를 구성하는 패턴이나 쉬운 방법이 있습니까?
$ dbmigrate # press Enter
실행하기 전에 별칭 확장을 에코하는 이유는 무엇입니까?
답변1
존재하다세게 때리다alias-expand-line
, readline 함수 가 있지만 history-and-alias-expand-line
기본적으로 어떤 키에도 바인딩되지 않습니다. 직접 바인딩할 수 있습니다 Control-T
. 예를 들면 다음과 같습니다.
bind '"\C-T": history-and-alias-expand-line'
Enter
누를 때마다 명령이 항상 실행되는 것은 아니기 때문에 자체 바인딩을 시도하는 것은 혼란스러울 수 있습니다 Enter
(예: 불완전한 파이프인 경우 등).
한 가지 더 문제가 있지만 DEBUG
명령이 실제로 사용자에 의해 입력되었는지(예: 명령 대체 PROMPT_COMMAND
에서 PS1
것은 까다로울 수 있습니다.어느실행 전 명령:
trap 'echo "> $BASH_COMMAND"' DEBUG
bash$ pwd
> pwd
존재하다다루기 힘든preexec
, 사용자가 입력한 명령과 다른 경우 확장 명령을 인쇄하는 함수를 간단히 정의할 수 있습니다 .
preexec(){ [ $1 != $2 ] && print -r "> $2" }
zsh$ j
> jobs
그러나 별칭을 강제로 확장하면 일부 별칭+히스토리 트릭이 제대로 작동하지 않습니다. 예를 들어, Escape 등 을 하지 않고도 c
이와 같은 계산을 수행하기 위해 bash에 별칭이 있습니다 .c 3.17 * 4.2
*
(
alias c='_c=$(fc -nl -0); bc -l <<<${_c#*c} #'
readline이 확장하면 기록의 현재 줄( 에서 반환한 줄 fc -nl -0
)은 다음과 같습니다.확장하다는 원래 명령이 아니며 모든 것이 무너질 것입니다.
답변2
별칭은 단순히 대체물일 뿐입니다. 명령을 실행하기 전에 메시지를 인쇄하는 등 좀 더 특이한 작업을 수행하려면 더 강력한 기능, 즉 함수가 필요합니다. 정의가 별칭 정의처럼 보이도록 하려면 함수를 정의하는 함수를 정의하면 됩니다.
function verbose_alias {
local name=${1%%=*} expansion=${1#*=}
eval "function $name {
printf >&2 '%s is an alias for %s\\n' \"$name\" \"$expansion\";
$expansion \"\$@\";
}"
}
verbose_alias dbmigrate='rails db:migrate'
답변3
POSIX 요구 사항set
주문하다이 옵션이 있습니다
-x
쉘은 명령을 확장한 후 명령을 실행하기 전에 각 명령의 추적을 표준 오류에 기록해야 합니다. 추적을 해제하는 명령을 추적할지 여부는 지정되지 않습니다.
https://pubs.opengroup.org/onlinepubs/009604499/utilities/set.html
따라서 호환 가능한 쉘에서 또는 를 사용할 수 있습니다 set -x
. set -o xtrace
Bash에서는 매뉴얼 페이지에서 다음을 볼 수 있습니다.
-x
각각의 단순 명령, 명령의 경우, 케이스 명령, 선택 명령 또는 명령의 산술이 확장된 후 PS4의 확장된 값이 표시되고 그 뒤에 명령 및 확장된 인수 또는 관련 단어 목록이 표시됩니다.
xtrace
와 동일합니다
-x
.
zsh에도 비슷한 옵션이 있습니다set
내장
XTRACE(
-x
, ksh-x
:)명령을 실행할 때 명령과 해당 인수를 인쇄합니다.
-x
스크립트나 명령을 실행할 때 옵션을 지정할 수도 있습니다.
bash -x -c "echo This will be printed before running; ll"
bash -x script-to-be-debugged.sh
zsh -x -c "...; 3; md did-you-see-the-aliases"
zsh -x buggy-script.sh
또한 각 프롬프트 전후에 실행되는 명령을 확장하므로 git
PS1에서 변수를 사용하는 경우와 같은 많은 경우에는 이상적이지 않을 수 있습니다. 깨끗한 Ubuntu VM에서는 실행 중인 명령만 인쇄됩니다.
당신은 또한 볼 수 있습니다set -x
효과 는 무엇입니까 ?
또 다른 옵션은 인쇄하기 전에 변수를 확장하거나 확장하지 않는 것 set -v
입니다.set -o verbose
답변4
Bash는 기본적으로 이 도움말을 제공하지 않습니다.
기본적으로 사용할 수 있는 두 가지 관련 기능은 다음과 같습니다.
shopt -s histverify
set 및 readline이 사용되는 경우 기록 대체 결과가 쉘 파서에 즉시 전달되지 않습니다. 대신, 결과 라인은 읽기 라인 편집 버퍼에 로드되어 추가 수정이 가능합니다.
누를 때의 동작 부분을 해결 Enter
하지만 명령줄에서만 히스토리 확장이 가능합니다. 예를 들어:
$ shopt -s histverify
$ echo "this is a test"
This is a test
$ echo !!
$ echo echo "this is a test" <---- expanded by the simple use of enter!!
- 독서선
shell-expand-line
쉘 연장 케이블(MCe)
껍질처럼 선을 확장하십시오. 이는 별칭 및 기록 확장은 물론 모든 쉘 단어 확장도 수행합니다. 기록 확장에 대한 설명은 아래의 기록 확장을 참조하세요.
이것이 바로 귀하가 달성하고자 하는 목표입니다. 그러나 이를 작동시키는 열쇠는 Ctrl다음 과 같습니다 Alt.e
shell-expand-line
죄송합니다. Enter 및 실행과 함께 사용할 솔루션을 모르겠습니다.