내가 원하는 건
단순화된 명령:echo "helloworld" | echo $1
- 알아요, 이것이 작동한다는 것은 알지만 ,
cat
이와 같은 명령이 파일을 입력으로 사용하지 않으면echo
어떻게 될까요 ?
내 실제 명령:ls -li init.vim | cut -d " " -f 1 | find / -inum $1
- 나는 그것이
$1
그렇게 작동하지 않는다는 것을 알고 있습니다. 이것은 단지 예일 뿐이고$1
자리 표시자일 뿐입니다.
명령 대체:find / -inum $(ls -li init.vim | cut -d " " -f 1)
- 이것은 잘 작동하지만 함께 작동하고 싶지 않습니다명령 대체.
질문
- 아무 일 없이 이게 될까?해결책또는명령 대체?
- 그렇지 않다면 가장 좋은 접근 방식은 무엇입니까?
당신의 도움을 주셔서 감사합니다:)
답변1
여기에서는 여러 find
구현을 통해 다음을 수행할 수 있습니다.
find / -samefile init.vim
inode 번호는 각 파일 시스템마다 고유하므로 이는 더 정확하므로 inode 번호 외에 장치 번호도 확인해야 합니다.
여기서 후행 개행 문자를 뺀 명령의 전체 출력이 명령에 인수로 전달됩니다.명령 대체이 경우 따옴표 없이는 의미가 없지만 갈 길입니다.
find / -inum "$(ls -id init.vim | awk '{print $1; exit}')"
아니요 -l
, 하지만 디렉토리 유형인 경우 문제를 피해야 합니다 -d
. init.vim
또한 참조하세요. ;exit
따라서 첫 번째 필드만 인쇄합니다.첫 번째 줄파일 이름에 개행 문자가 포함된 경우를 처리합니다.
또는 더 나은 방법은 먼저 inode 번호를 얻을 수 있는지 확인하는 것입니다.
그리고
#! /bin/sh -
file=init.vim
inode=$(
set -o pipefail # also care about ls exit status below
ls -id -- "$file" | awk '{print $1; exit}'
) || exit
find / -inode "$inode"
(여기서는 목록 컨텍스트에 있지 않고 스칼라 변수 할당이므로 분할+glob이 발생하지 않으므로 따옴표 없이 그대로 두는 것이 좋습니다.)
입력 스트림을 매개변수 목록으로 변환하는 일반적인 명령은 명령 xargs
(교차 매개변수)입니다.
ls -id init.vim | awk '{print $1; exit}' |
xargs -I @INODE@ find / -inum @INODE@
xargs
인수를 구성하기 위해 입력을 분할(자신만의 방식으로, 일부 참조 형식을 이해함)한다는 점은 주목할 가치가 있습니다. 을 사용하면 -I
분할이 없을 때와 다르게 수행됩니다. 자세한 내용은 시스템의 매뉴얼 페이지를 참조하세요.POSIX 사양당신이 기대하는 휴대성. 이 경우 12345<newline>
의 출력은 매개변수 awk
로 분할됩니다 12345
.