프로그램을 래핑하고 때로는 인수를 추가하는 데 사용되는 Bash 함수

프로그램을 래핑하고 때로는 인수를 추가하는 데 사용되는 Bash 함수

일반적인 솔루션에 관심이 있지만 특정 예제 문제는 파일 경로가 누락된 경우 명령에 래핑하고 추가하는 .bashrc함수를 작성하는 것입니다. grep기본적으로 grep이 stdin을 기다릴 때마다 나는 대신 특정 파일을 검색하기를 원합니다. 내 질문은 최종 인수가 검색 패턴과 같이 검색 경로인지 (래퍼에서) 어떻게 알 수 있느냐는 것입니다.

$ ls
example_file.txt
$ grep -someopts 'somestring' 'example_file.txt'

이것이 -someopts실제로 grep에 유효한 옵션이라고 가정하십시오.
마지막 매개변수는 패턴(검색용)인가요, 아니면 파일(검색용)인가요? - 옵션 중 하나에 대한 인수가 검색할 패턴이면 grep은 표준 입력을 기다립니다
. 그렇지 않으면 검색할 패턴이 검색됩니다.somestringexample_file.txtsomestringexample_file.txt

전자의 경우 검색할 내 파일을 명령 끝에 추가하고 싶지만 오탐 없이는 해당 사례를 감지할 수 없습니다. 유일한 방법은 grep이 취할 수 있는 모든 인수를 고려하는 래퍼인 것 같습니다.

이것은 내 래퍼 함수입니다( check_has_path구현해야 하는 경우).

function grep_wrapped() {
    if check_has_path ; then
        grep "$@"
    else
        grep "$@" '/default/filepath.txt'
    fi
}

답변1

방법: 명령줄의 패턴 및 가능한 파일 이름에서 명령줄 옵션을 분리한 다음 옵션이 아닌 명령줄 인수를 평가합니다. 둘 이상이면 명령을 그대로 실행하고, 그렇지 않으면 파일에 표시하십시오.

존재하다 bash:

mygrep () {
    local -a opts

    while [ "$#" -gt 0 ]; do
        case "$1" in
            --) opts+=( "$1" ); shift; break ;;
            -*) opts+=( "$1" ) ;;
            *)  break
        esac
        shift
    done

    if [ "$#" -gt 1 ]; then
        grep "${opts[@]}" "$@"
    else
        grep "${opts[@]}" "$@" "/my/file"
    fi
}

이 함수는 명령줄 옵션을 명령줄의 나머지 부분과 분리하고 옵션이 아닌 여러 명령줄 인수(즉, 패턴 외부의 인수)가 있는지 확인합니다. 그렇지 않은 경우 파일은 명령 끝에 표시됩니다.

옵션 인수(예를 들어)와 함께 옵션을 사용하는 경우에는 작동하지 않으므로 -e PATTERN다소 결함이 있습니다. 어쩌면 다른 사람들의 출발점으로 사용될 수 있을까요?


이 사용자의 댓글을 보면 분명합니다.아니요실행에는 grep전혀 관심이 없지만 특정 확장자를 가진 파일을 검색하는 데는 관심이 있습니다.

다음 셸 함수를 사용하면 이 작업을 수행할 수 있습니다.

extfind () {
    local ext="$1"

    if [ -z "$ext" ]; then
        echo 'Missing extension' >&2
        return 1
    fi

    shift
    local dir="${1:-$HOME}"

    find "$dir" -type f -name "*.$ext"
}

이 기능은 다음과 같이 사용됩니다.

$ extfind txt

.txt이름이 다음으로 끝나는 홈 디렉토리 안이나 아래의 모든 파일을 찾습니다 .

$ extfind "[hc]" /usr/src

이름이 또는 로 끝나는 디렉토리 안이나 디렉토리 아래의 .h모든 .c파일을 찾습니다 /usr/src.

답변2

Pythonesque를 시도해 보고 예외가 있으면 다른 작업을 수행할 수 있습니다. 그것은 다음과 같습니다:

function grep_wrapped(){
    grep "$@" <&-
    local rc=$?
    if [ $rc = 2 ]      # probably a read error from closed stdin
    then   grep "$@" /default/filepath.txt
    else   return $rc
    fi
}

모든 작업을 grep에 맡깁니다. 이로 인해 오류 메시지가 생성되는 부작용이 있습니다.

grep: (standard input): Bad file descriptor

grep에서 종료 코드 2가 표시되면 stdin이 닫혀 있기 때문입니다. 분명히 stderr를 리디렉션하여 파일이나 변수로 캡처하고 반환 코드가 0 또는 1일 때 인쇄할 수 있습니다.

관련 정보