내가 원하는 건

내가 원하는 건

내가 원하는 건

단순화된 명령: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. 아무 일 없이 이게 될까?해결책또는명령 대체?
  2. 그렇지 않다면 가장 좋은 접근 방식은 무엇입니까?


당신의 도움을 주셔서 감사합니다:)

답변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.

관련 정보