사용자 정의 내장 함수 bash
(예: ) 를 만들고 싶습니다 time
. 가능합니까? 그렇지 않다면 다른 쉘에 있을 수 있습니까?
예를 들어, 저는 이것을 CWD의 모든 디렉터리에서 실행 map find -name '*.js' | xargs grep func1
하고 싶습니다. find -name '*.js' | xargs grep func1
다 참고해주세요파이프 포함로 전달됩니다 map
.
목표는 여러 디렉터리에 걸쳐 명령을 적용하는 것입니다. 나는 생산된 모든 것을 map
다루는 스크립트를 작성했습니다 . 그러나 파이프, 리디렉션 등이 포함된 명령을 실행하려면 문자열 내의 모든 내용을 인용해야 합니다. 이런 일이 발생하지 않도록 하는 방법을 찾고 있습니다.eval
$1
ls
또한 이것이 가능한지 궁금합니다. ;)
답변1
ATT ksh, bash 및 zsh에는 모두 기존 셸 인스턴스에 추가 코드를 로드할 수 있는 동적 모듈 로딩 시스템과 새로운 내장 기능을 구현하기 위해 동적으로 로드된 코드가 있습니다. 그러나 당신은 새로운 내장 기능 이상의 것을 요구하고 있습니다. 새로운 구문이 필요하며 쉘이 이를 처리할 수 없다고 생각합니다. 셸 소스 코드에서 구문 분석기를 수정해야 합니다.
zsh에서는 원하는 구문에 가까워질 수 있습니다.
for x (*/) (cd $x && pipeline)
별칭을 만들 수 있지만 alias map='for x (*/) (cd $x &&'
끝에는 여전히 닫는 대괄호가 필요합니다. 조잡한 해킹으로 원하는 구문을 얻을 수 있습니다.
alias map='map__PWD=$PWD; for x (./*/ "") cd $map__PWD${x#.}/ && [[ -z $x ]] || '
이것은 너무 추악하고 깨지기 쉬우며 일반화할 수 없기 때문에 설명하지 않겠습니다. 작동 방식을 완전히 이해하지 못한다면 사용을 고려하지 마세요.
답변2
이 경우에는 다음과 같습니다.
find . -type f -name "*.js" -exec grep -qF "func1" {} \; -print
*.js
현재 디렉토리 안이나 아래에서 문자열을 포함하는 파일 이름을 찾는 것만으로도 충분할 수 있습니다 func1
.
현재 디렉토리의 파일을 피하려면 다음을 수행하십시오.
find . -mindepth 2 -type f -name "*.js" -exec grep -qF "func1" {} \; -print
를 사용하면 -mindepth 2
" find
깊이 1"(즉, 현재 디렉터리)의 어떤 것과도 일치하지 않습니다.
마지막 작업은 기본적으로 요청한 작업을 수행합니다. grep
현재 디렉터리의 모든 하위 디렉터리에서 효과적으로 실행됩니다.