bash 사용자 정의 내장

bash 사용자 정의 내장

bash예를 들어 저는 사용자 정의 내장 기능을 만들고 싶습니다 time. 이것이 가능한가? 그렇지 않은 경우 다른 쉘에서 가능합니까?

예를 들어, 나는 다음을 수행하고 싶습니다. CWD 내의 모든 디렉터리 내에서 map find -name '*.js' | xargs grep func1실행되도록 합니다 . find -name '*.js' | xargs grep func1모든 것을 주목하세요파이프를 포함해로 전달됩니다 map.

목표는 여러 디렉터리에 명령을 적용하는 것입니다. 나는 생산되는 모든 것에 걸쳐 mapwhich evals 라는 스크립트를 작성했습니다 . 그러나 실행하려는 명령에 파이프, 리디렉션 등이 포함되어 있으면 문자열 안의 모든 내용을 인용해야 합니다. 그렇게 하지 않아도 되는 방법을 찾고 있어요.$1ls

또한 이것이 가능한지 궁금합니다. ;)

답변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현재 디렉터리의 각 하위 디렉터리에서 효과적으로 실행됩니다 .

관련 정보