두 개의 명령을 입력으로 받아 두 명령의 실행 시간을 계산한 다음 해당 시간을 텍스트 파일로 출력하는 함수를 작성하려고 합니다. 읽고 나서이 게시물, 대부분의 작업을 완료했으며 실행 시간을 한 번에 파일에 기록할 수 있습니다. 지금 겪고 있는 문제는 두 개의 다중 단어 입력을 허용하는 함수를 얻는 것입니다. 내 현재 코드는 다음과 같습니다
timeDiff () {
{ time "$1" ; } 2> ~/file.txt
{ time "$2" ; } 2>> ~/file.txt
}
내가 원하는 기능을 사용하여 라인을 순차적으로 실행하면 모든 것이 정상입니다. 이 파일은 두 기능의 타이밍 정보로 덮어쓰여집니다. 이에 대한 나의 시도와 질문은 다음과 같습니다.
timeDiff grep "str" file1 query database lookup.sql
이로 인해 내 파일에 grep 및 bash: str: command not found
.
timeDiff 'grep "str" file1' 'query database lookup.sql'
이로 인해 내 파일이 때때로 표시될 수 있습니다. bash:grep "str" file1: 해당 파일 또는 디렉터리가 없으며 bash:query 데이터베이스 Lookup.sql: 해당 파일 또는 디렉터리가 없습니다.
내 생각엔 이것이 따옴표가 필요한 내 grep과 관련이 있다고 생각하지만 아마도 함수에 입력을 작성하는 더 좋은 방법이 있을 수 있습니다. 저는 초보자라서 배우고 싶습니다! 감사해요!
답변1
그리고:
{ time "$1" ; } 2> ~/file.txt
bash
이와 같은 time
키워드가 있는 쉘 의 경우 time
해당 키워드를 사용하여 쉘 코드의 계산 시간을 계산할 수 있습니다 "$1"
. "$1"
함수의 첫 번째 위치 인수에 이름이 있는 명령을 실행하는 코드입니다.
그리고:
timeDiff grep "str" file1 query database lookup.sql
첫 번째 인수와 두 번째 인수(및 세 번째 인수 등) timeDiff
로 호출하고 있습니다 .grep
str
file1
따라서 time "$1"
인수 없이 호출된 명령의 실행 시간이 계산됩니다 grep
. grep
최소한 하나의 매개 변수가 필요하므로 불평합니다.
존재하다
timeDiff 'grep "str" file1' 'query database lookup.sql'
이번에 $1
는 그럴 것이지만, grep "str" file1
그 이름으로 된 명령이 있을 가능성은 거의 없습니다.
당신이 원하는 것은 다음과 같이 첫 번째와 두 번째 인수에 전달된 셸 코드의 평가 시간을 맞추는 것 같습니다.
timeDiff () {
time eval " $1"
time eval " $2"
} 2> ~/file.txt
아니면:
timeDiff () {
eval "time {
$1
}"
eval "time {
$2
}
} 2> ~/file.txt
다음으로 구성된 셸 코드를 평가합니다.
time {
contents-of-$1
}
본문이 첫 번째 위치 인수의 내용인 명령 그룹의 타이밍을 지정합니다.
또한 다음 사항에 유의하세요.
{ time cmd; } 2> file
타이머는 만료되지만 file
오류가 발생합니다 cmd
(및 쉘이 실행될 수 없는 오류가 cmd
있는 경우).
얻기 위해오직그때쯤에는 file
다음과 같은 것이 필요할 것입니다:
{ time cmd 2>&3 3>&-; } 3>&2 2> file
답변2
timeDiff grep "str" file1 query database lookup.sql
$1=grep 및 $2=str이 됩니다.
timeDiff 'grep "str" file1' 'query database lookup.sql'
$1을 "grep "str"file1"이라는 문자열로 만들어서 다음과 같은 이름의 파일을 찾습니다.
./grep_"str"_file1
여기서 _는 공백 문자입니다. 해당 파일이 없습니다.
배쉬를 사용해야합니다평가하다함수는 문자열을 실행 가능한 명령줄 문으로 변환합니다.
하지만 "평가는 악하다"는 말에는 이유가 있으니 주의하세요 :)