
bash
예를 들어 저는 사용자 정의 내장 기능을 만들고 싶습니다 time
. 이것이 가능한가? 그렇지 않은 경우 다른 쉘에서 가능합니까?
예를 들어, 나는 다음을 수행하고 싶습니다. CWD 내의 모든 디렉터리 내에서 map find -name '*.js' | xargs grep func1
실행되도록 합니다 . find -name '*.js' | xargs grep func1
모든 것을 주목하세요파이프를 포함해로 전달됩니다 map
.
목표는 여러 디렉터리에 명령을 적용하는 것입니다. 나는 생산되는 모든 것에 걸쳐 map
which eval
s 라는 스크립트를 작성했습니다 . 그러나 실행하려는 명령에 파이프, 리디렉션 등이 포함되어 있으면 문자열 안의 모든 내용을 인용해야 합니다. 그렇게 하지 않아도 되는 방법을 찾고 있어요.$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
현재 디렉터리의 각 하위 디렉터리에서 효과적으로 실행됩니다 .