TL; DR : alias @@='$($(fc -ln -1) |& tail -1)'
Bash의 히스토리 상호 작용 기능 은 명령 의 출력 을 검사하는 메커니즘을 제공하지 않습니다 . 쉘은 저장하지 않으며 , 히스토리 확장은 특별히 실행 한 명령 또는 해당 명령의 일부를위한 것입니다.
이로써 마지막 명령을 다시 실행하고 stdout 및 stderr ( |&)를 명령 대체로 파이프하는 방법이 남습니다 . heemayl의 대답은 이것을 달성하지만 셸은 별칭을 확장하기 전에 히스토리 확장을 수행하기 때문에 별칭을 사용할 수 없습니다.
로 함수에서 활성화하더라도 쉘 함수에서 히스토리 확장을 작동시킬 수 없습니다 set -H. 나는 !!함수가 확장되지 않을 것이라고 의심 하고, 그것이 확장되었을 때 확장 될지 확실하지 않지만, 지금 왜 그것이 확장되지 않았는지 정확히 모르겠습니다 .
따라서 아주 적은 타이핑으로이를 수행 할 수 있도록 설정하려면 히스토리 확장 대신 fc쉘 내장을 사용하여 히스토리에서 마지막 명령을 추출해야합니다. 이것은 기록 확장이 비활성화 된 경우에도 작동한다는 추가 이점이 있습니다.
에 나타낸 바와 같이 고든 데이비슨 의 대답 에 bash는 역사 확장을 포함하는 별칭 만들기 (에 슈퍼 사용자 ) $(fc -ln -1)을 시뮬레이션을 !!. heemayl의 명령!! 에 이것을 연결 하면 다음과 같습니다. $(!! |& tail -1)
$($(fc -ln -1) |& tail -1)
이것은 작동 $(!! |& tail -1)하지만 별칭 정의로 갈 수 있습니다.
alias @@='$($(fc -ln -1) |& tail -1)'
해당 정의를 실행하거나 새 셸 에 .bash_aliases넣거나 .bashrc새 셸을 시작한 @@후 마지막 명령에서 마지막 출력 줄을 실행하기 위해 간단히 입력 (또는 별명이라는 이름을 지정할 수 있음) 할 수 있습니다 .
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....