주어진 인덱스/줄 번호에서 마지막 명령 출력을 재사용합니다.

주어진 인덱스/줄 번호에서 마지막 명령 출력을 재사용합니다.
ls

보여주다:

entry1
entry2
entry3

다음 쉘 명령에서 위의 출력(모든 항목이 아니라 n과 같은 특정 행에 대한 항목)을 재사용하려면 어떻게 해야 합니까?

그것은 다음과 같습니다:

vi $(!!)@3

다음을 의미해야 합니다.

vi entry3

답변1

출력을 직접 재사용할 수는 없습니다. 비디오 메모리에 픽셀 묶음으로 저장되거나 터미널 에뮬레이터의 메모리에 저장될 수도 있지만 거기에서 다시 가져올 수 있는 편리한 방법은 없습니다. 할 수 있는 일은 명령을 다시 실행하고 이번에는 출력을 캡처하는 것입니다. 그것이 바로 그 일입니다 !!.

zsh에서는 다음을 사용하십시오.매개변수 확장 플래그중첩된 대체를 통해 선택한 행을 추출합니다. 또는 외부 유틸리티를 사용하여 분할하여 입력하기 쉽게 할 수도 있습니다.

vi "${${(f)$(!!)}[3]}"
vi "$(!! | awk NR==3)"

이는 zsh에서도 실제로 큰따옴표가 필요한 몇 안 되는 경우 중 하나입니다. 그렇지 않으면 명령의 출력이 공백으로 구분된 구성 요소로 분할됩니다. 공백으로 구분된 구성 요소가 괜찮다면 더 짧은 명령을 사용할 수 있습니다.

vi ${$(!!)[3]}

답변2

출력에서 특정 줄을 추출하는 일반적인 방법은 headtail명령을 결합하는 것입니다.

LINE=3
ls | head -n $LINE | tail -n 1
  • ls이 명령은 초기 출력을 생성합니다.
  • head -n $LINE$LINE원본 출력의 첫 번째 줄만 유지하고,
  • tail -n 1명령 출력의 마지막 줄만 유지됩니다 head.

마지막으로, 주어진 위치의 라인만 유지됩니다.

따라서 예를 계속 진행하려면 이 출력에 를 사용하여 편집해야 하는 파일의 이름이 포함되어 있다고 가정하고 vi다음 구문을 사용하여 이 출력을 사용할 수 있습니다.

vi $(ls | head -n $LINE | tail -n 1)
vi `ls | head -n $LINE | tail -n 1`

첫 번째는 가독성 때문에 선호됩니다. 두 번째는 이전 시스템과 호환되는 기록 버전입니다.

마지막으로 주목해야 할 점은 초기 명령( ls이 경우 간단한 명령)이 실행되는 데 시간이 걸리고 리소스를 소비할 수 있다는 것입니다. 출력에서 몇 줄을 가져와야 하는 경우 주저하지 말고 출력을 변수나 파일에 저장하여 한 번만 실행하면 됩니다.

# Using a variable:
my_ls=$(ls)
vi $(echo "$my_ls" | head -n 3 | tail -n 1)
vi $(echo "$my_ls" | head -n 26 | tail -n 1)
vi $(echo "$my_ls" | head -n 1900 | tail -n 1)

# Using a file:
ls >./my_ls
vi $(cat ./my_ls | head -n 3 | tail -n 1)
vi $(cat ./my_ls | head -n 26 | tail -n 1)
vi $(cat ./my_ls | head -n 1900 | tail -n 1)

답변3

저는 zsh에 대한 경험이 많지 않지만 가능한 접근 방식은 다음과 같습니다.

$ p() { i=$1 && shift && a=("${(@f)$("$@")}") && echo "${a[$i]}" }
$ ls
entry1
entry2
entry3
$ echo $(p 3 !!)
echo $(p 3 ls)
entry3

배쉬의 경우:

$ p() { i=$1 && shift && IFS=$'\n' a=($("$@")) && echo "${a[$((i-1))]}"; }

나는 이것이 꽤 번거로운 구문이고 오류 검사가 없다는 것을 인정합니다.

관련 정보