Bash 파일에서 사용자 정의 함수를 만드는 방법

Bash 파일에서 사용자 정의 함수를 만드는 방법

새 세션을 열 때 동일한 사용자 정의 함수를 평가(또는 가져오기)하고 해당 기능을 쉽게 사용할 수 있도록 설정 파일 중 하나에서 사용자 정의 함수를 생성하는 방법을 찾고 있습니다.

로그 파일에 존재하는지 확인하는 함수를 만들려고 하므로 ERROR로그 파일을 확인할 때 함수 이름과 로그 파일 이름만 입력합니다. 이제 grep을 사용하고 있습니다.grep ERROR test.txt

하지만 이런 수표가 많기 때문에 더 쉽게 만들고 싶습니다. 그래서 다음 줄을 추가합니다 .bashrc.

ok(){grep ERROR $filename}

함수를 사용할 때 입력이 예상됩니다. ok test.txt 그리고 오류 줄이 있으면 표시되어야 합니다.

그러나 .bashrc파일을 평가한 후 오류 메시지가 나타납니다.

-bash: .bashrc: line 16: syntax error: unexpected end of file

내가 입력하면 ok test.txt다음이 제공됩니다.

-bash: ok: command not found

이 사용자 정의 기능을 구현하는 데 도움을 줄 수 있는 사람이 있습니까? 아니면 코드를 다른 설정 파일에 붙여넣어야 합니까 .bashrc-profile?

미리 감사드립니다!

답변1

쉘은 { ... }구문의 구문과 공백에 대해 매우 까다롭습니다. 이 기능을 설정하는 방법에는 두 가지가 있습니다.

ok() { grep ERROR $filename; }
ok() {
    grep ERROR $filename
}

중괄호 { .. }와 괄호에 관해서는 ( .. ),Bash 매뉴얼에는 다음과 같은 내용이 나와 있습니다.:

후행 세미콜론(또는 개행 문자)목록필요합니다.

그리고

중괄호는 예약어이므로 다음과 같이 사용해야 합니다.목록공백이나 기타 셸 메타 문자로 구성됩니다.

목록중괄호 안의 명령을 나타내며, 모두 { ... }사용된 곳에 적용되지만 함수가 가장 일반적일 것입니다.

또한 파일 이름을 함수의 인수로 전달하려면 $1해당 파일 이름을 사용하세요. 즉, ok() { grep ERROR "$1"; }로 사용할 수 있습니다 ok test.txt.

답변2

꼭 이렇게 할 필요는 없습니다. 그러면 당신은 자유로움을 느끼고 큰 이익을 얻을 것입니다.

ok() { set -f
if test -z "$2"
then
  grep -HPine "$1" -r --include=*.log --include=*.txt
else
  grep -HPine "$1" -r --include="$2"
fi
}

$ ok error test.txt
$ ok err test.txt
$ ok error
$ ok 'err|warn'
$ ok error logdata.*

세 번째 사용법은 현재 디렉토리의 모든 디렉토리에서 log 및 txt 확장자를 가진 모든 파일에서 "error" 문자열이 있는 모든 줄을 찾습니다.
네 번째 사용법은 log 및 txt 확장자를 가진 모든 파일에서 "error" 문자열이 있는 모든 줄을 찾습니다. 또는 "warn" 현재 디렉터리의 모든 디렉터리
다섯 번째는 현재 행 디렉터리의 모든 디렉터리에서 문자열 "error"를 포함하는 확장자를 가진 logdata라는 이름의 모든 파일을 찾습니다.

관련 정보