![Bash 파일에서 사용자 정의 함수를 만드는 방법](https://linux55.com/image/127825/Bash%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%A0%95%EC%9D%98%20%ED%95%A8%EC%88%98%EB%A5%BC%20%EB%A7%8C%EB%93%9C%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
새 세션을 열 때 동일한 사용자 정의 함수를 평가(또는 가져오기)하고 해당 기능을 쉽게 사용할 수 있도록 설정 파일 중 하나에서 사용자 정의 함수를 생성하는 방법을 찾고 있습니다.
로그 파일에 존재하는지 확인하는 함수를 만들려고 하므로 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라는 이름의 모든 파일을 찾습니다.