"유형"명령으로 배관


10

여러 명령의 유형을 찾고 싶습니다. Linux 에서 명령 으로 파이프 또는 xargs검색 결과 를 파이프 할 수 있습니까?findtype

예를 들면 다음과 같습니다.

find . -name anacron | type

또는

find . -name anacron | xargs type

나는 Oli 답변이 가장 좋은 답변이라고 생각합니다. 카오스 답변은 효과가 있지만 Oli 답변은 영리합니다.
Helio

답변:


17

type정상적인 명령이 아닙니다. 쉘 부틴입니다. 보다:

$ type type
type is a shell builtin

그래서, 당신은 호출 할 필요 bash-c당신이 원하는 것을 달성하기 위해

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

또는 더 간단합니다 (필요 없음 xargs).

$ find . -name anacron -exec bash -c "type {}"  \;

bash -c "type ./file"에서 찾은 모든 파일과 함께을 호출 합니다 find. -I에서 xargs수단, 우리는 여기에 자리 정의 {}나중에 사용할 수 있습니다. 이 자리 표시자는 찾은 파일 이름으로 바뀝니다.

쉘 내장이 작동하지 않는 이유 xargs:

[...] 내장 명령은 쉘 자체에 포함되어 있습니다. 내장 명령의 이름이 단순 명령의 첫 단어로 사용되면 쉘은 다른 프로그램을 호출하지 않고 명령을 직접 실행합니다. [...]


xargs는 표준 입력 [...]에서 항목을 읽고 명령을 실행합니다.

이 경우 명령은 간단한 실행 파일이며 쉘 내장은 실행 파일이 아닙니다. 파일 시스템에서 찾을 수 없습니다. 쉘 자체에 있습니다. 따라서 쉘을 호출하고 호출 된 쉘에 내장 명령을 호출하도록 지시해야합니다. 그게 일어난 일입니다 bash -c "command".


3
당신은 그것을 응축 할 수 있습니다find ... -exec bash -c 'type "$@"' _ {} +
muru

2
@muru 실제로, 나는 내 자신의 대답을 다시 읽고 그것을 보았다 =)
chaos

11

여기에 몇 가지 문제가 있습니다 (일부는 이미 강조 표시됨).

  • type내장입니다. 해결 된 명령이 아니며 bash 내부의 함수입니다. 참조하십시오 man bash-builtins. 그것은 bash의 맥락에서만 작동하므로 포크 xargs또는 -exec포크 서브 쉘 은 아닙니다 .
  • type자체 경로 검색을 수행하는 데 사용됩니다. 경로 find를 지정하지 않으면 (아직하지 않을 것입니다) 아마도 해당 경로를 반환 할 것입니다. readlink -f심볼릭 링크를 해결하려는 경우 더 나을 수 있습니다. 하루 종일 xargs readlink또는 파이프로 연결할 수 있습니다 -exec readlink -f {} +.

그것은 당신이하려는 일을 할 수 없다고 말하는 것이 아닙니다. 두 가지 옵션이 있습니다. 이 type명령은 한 번에 많은 이름을 처리 할 수 ​​있으므로 모든 이름을 한 번에 제공 할 수 있습니다.

type $(find /usr/sbin -name anacron)

많은 명령의 경우 인수가 너무 많으면 명령 행 길이 제한을 초과합니다 (참조 getconf ARG_MAX). 그러나 type쉘에 내장되어 있고 새 프로세스 ID를 생성하지 않기 때문에이 경우에는 적용 되지 않습니다 (길이 제한 은 일반 명령 행에서 하위 프로세스가 사용 하는 exec () 함수에 적용됨 ).


1
고마워 올리! 이 리눅스 초보자는 "유형"과 그 동작에 관해 오늘 새로운 것을 배웠습니다.
LjinKazama
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.