Bash 쉘을 사용하여 분석을 실행할 때 좋은 결과를 제공하는 명령을 동일한 디렉토리(이름대로 "LOGBOOK")의 파일에 저장하여 내가 어떤 명령을 수행했는지 확인할 수 있는 경우가 많습니다. 이런 결과를 얻기 위해 이렇게 했습니다. 지금까지 이것은 터미널에서 명령을 복사하여 붙여넣거나 "위로"를 눌러 명령을 로 수정 echo"my command" >> LOGBOOK
하거나 기타 유사한 장난을 의미합니다.
일전에 도구가 있다는 것을 알았지만 history
, 이전에 실행한 명령을 가져와서 그런 작업을 수행할 수 있는 방법을 찾을 수 없었습니다 getlast >> LOGBOOK
.
이를 수행하는 좋은 간단한 방법이 있습니까? 아니면 다른 사람들은 자신이 얻은 결과를 저장하는 명령을 어떻게 처리합니까?
답변1
를 사용하는 경우 bash
다음 fc
명령을 사용하여 원하는 방식으로 기록을 표시할 수 있습니다.
fc -ln -1
그러면 마지막 명령이 인쇄됩니다. -l
목록을 나타내고 -n
명령 번호를 줄 접두사로 사용하지 않음을 나타내며 -1
마지막 명령만 표시됨을 나타냅니다. 줄 시작 부분의 공백(여러 줄 명령의 첫 번째 줄만)이 귀찮은 경우 를 사용하여 쉽게 제거할 수 있습니다 sed
. 이것을 쉘 함수로 바꾸면 요청된 솔루션을 얻을 수 있습니다( getlast >> LOGBOOK
).
getlast() {
fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}
질문에 요청한대로 작동합니다.
"$1" "$1"
명령에 추가하여 약간의 변경 사항을 추가했습니다 fc
. 예를 들어, getlast mycommand
호출된 마지막 명령줄을 인쇄 할 수 mycommand
있으므로 다른 명령을 실행하기 전에 저장하는 것을 잊어버린 경우에도 명령의 마지막 인스턴스를 쉽게 저장할 수 있습니다. 인수를 전달하지 않으면 getlast
(예: fc
as 호출하면 fc -ln "" ""
마지막 명령만 인쇄됩니다)
[참고: @Bram의 의견 및 @glenn jackman의 답변에 언급된 문제를 설명하기 위해 답변을 편집했습니다. ]
답변2
@camh의 답변에 대한 한 가지 문제점은 여러 줄에 걸쳐 있는 명령이 있는 경우 첫 번째 줄만 표시된다는 것입니다.
$ echo "one
> two
> three"
one
two
three
$ fc -lnr | head -1
echo "one
이 시도:
$ alias getlast='fc -nl $((HISTCMD - 1))'
$ echo "one
> two
> three"
one
two
three
$ getlast
echo "one
two
three"
답변3
"!!"
위쪽 화살표를 사용하는 대신 를 사용하여 이전 명령을 참조할 수 있습니다.
예를 들어
$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK
참고: 텍스트를 인용하지 않습니다.
답변4
fc -l | awk 'FNR == 15 {print $2}' > /tmp/last_command
나는 awk를 사용하여 fc -l 출력에서 마지막 명령을 캡처하고 /tmp/last_command에 인쇄합니다.