ls
보여주다:
entry1
entry2
entry3
다음 쉘 명령에서 위의 출력(모든 항목이 아니라 n과 같은 특정 행에 대한 항목)을 재사용하려면 어떻게 해야 합니까?
그것은 다음과 같습니다:
vi $(!!)@3
다음을 의미해야 합니다.
vi entry3
답변1
출력을 직접 재사용할 수는 없습니다. 비디오 메모리에 픽셀 묶음으로 저장되거나 터미널 에뮬레이터의 메모리에 저장될 수도 있지만 거기에서 다시 가져올 수 있는 편리한 방법은 없습니다. 할 수 있는 일은 명령을 다시 실행하고 이번에는 출력을 캡처하는 것입니다. 그것이 바로 그 일입니다 !!
.
zsh에서는 다음을 사용하십시오.매개변수 확장 플래그중첩된 대체를 통해 선택한 행을 추출합니다. 또는 외부 유틸리티를 사용하여 분할하여 입력하기 쉽게 할 수도 있습니다.
vi "${${(f)$(!!)}[3]}"
vi "$(!! | awk NR==3)"
이는 zsh에서도 실제로 큰따옴표가 필요한 몇 안 되는 경우 중 하나입니다. 그렇지 않으면 명령의 출력이 공백으로 구분된 구성 요소로 분할됩니다. 공백으로 구분된 구성 요소가 괜찮다면 더 짧은 명령을 사용할 수 있습니다.
vi ${$(!!)[3]}
답변2
출력에서 특정 줄을 추출하는 일반적인 방법은 head
및 tail
명령을 결합하는 것입니다.
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))]}"; }
나는 이것이 꽤 번거로운 구문이고 오류 검사가 없다는 것을 인정합니다.