Enter를 눌렀을 때 확장된 별칭을 반영하는 모드가 Bash 및 Zsh에 있습니까?

Enter를 눌렀을 때 확장된 별칭을 반영하는 모드가 Bash 및 Zsh에 있습니까?

예를 들어, 내가 가지고 있는

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 xtraceBash에서는 매뉴얼 페이지에서 다음을 볼 수 있습니다.

-x

   각각의 단순 명령, 명령의 경우, 케이스 명령, 선택 명령 또는 명령의 산술이 확장된 후 PS4의 확장된 값이 표시되고 그 뒤에 명령 및 확장된 인수 또는 관련 단어 목록이 표시됩니다.

xtrace

   와 동일합니다 -x.

https://linux.die.net/man/1/bash

zsh에도 비슷한 옵션이 있습니다set내장

XTRACE( -x, ksh -x:)

   명령을 실행할 때 명령과 해당 인수를 인쇄합니다.

https://linux.die.net/man/1/zshoptions

-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

또한 각 프롬프트 전후에 실행되는 명령을 확장하므로 gitPS1에서 변수를 사용하는 경우와 같은 많은 경우에는 이상적이지 않을 수 있습니다. 깨끗한 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 및 실행과 함께 사용할 솔루션을 모르겠습니다.

관련 정보