fastex
예를 들어 2개의 가능한 매개변수( g
또는 )를 사용하여 t
스크립트를 실행하고 싶습니다 fastex g
.
내가 호출하려는 인수에 따라 geany $file
또는 texstudio $file
. 이것이 선택 편집기입니다.
나는 노력했다
editor=$1
if ["$1" = "g"]; then
geany "$file".tex
exit 1
else
linha=$(wc -l < "$file".tex)
texstudio --line $linha "$file".tex
exit 1
fi
그러나 출력 fastex.sh g
은 /usr/bin/fastex.sh: 31: [g: not found
이고 항상 켜져 있습니다 texstudio
. 합격해도 마찬가지다 t
.
답변1
후행 공백은 실제로 인수(셸에서 해석될 수도 있고 해석되지 않을 수도 있음)를 읽는 명령(예: )이기
if [
때문에 필요합니다. 을 사용하면 셸의 내부 논리가 사용됩니다(새 프로세스가 시작되지 않으므로 더 빠릅니다). 쉘은 및 내장 함수로 해석 할 수 있지만 를 사용하여 이 기능을 끌 수 있습니다(그리고 실제로 새 프로세스를 시작할 수 있습니다).[
test
[[
[
test
enable
=
비교 연산자입니다~에그러나 다른 곳에서는 할당 연산자이기도 합니다. 및test
는=
POSIX 규격이지만 POSIX 규격을 추구하지 않는 한==
( 에서 식별됨[[
)을 사용하는 것이 합리적인 선택인 것 같습니다. 쉘 컨텍스트 종속 의미의 불일치를 더 온전하게 만들기 때문입니다=
.exit 1
- 에디터의 반환 값을 효과적으로 폐기하는 이유는 무엇입니까? 완전히 무시하거나exec
스크립트를 편집기로 바꾸십시오.
#!/bin/bash
editor=$1
if [[ "$1" == "g" ]]; then
exec geany "$file.tex"
else
linha=$(wc -l < "$file.tex")
exec texstudio --line $linha "$file.tex"
fi
답변2
if ["$1" = "g"]; then
[
]
및 일반 명령처럼 구문 분석되기 때문에 공백이 필요합니다 . 실제로 [
이것은 일반적인 명령입니다(대부분의 쉘에 내장된 명령입니다).
exit 1
편집기를 실행한 후 오류 상태로 종료되는 이유는 무엇입니까? 반환 상태 0은 성공을 나타내고 다른 값은 실패를 나타냅니다. 스크립트가 편집기와 동일한 상태로 돌아가도록 해야 합니다. 작성된 대로 완전히 포기할 수 있습니다 exit
. 쉘이 스크립트 끝에 도달하면 스크립트 실행을 종료하고 마지막으로 실행된 명령의 상태를 반환합니다.
개선 사항으로 사용할 수 있습니다exec
내장이렇게 하면 편집기를 하위 프로세스로 실행하는 대신 스크립트가 종료되고 편집기로 대체됩니다. (같은 프로세스는 계속 실행되지만 코드가 다른 프로그램의 코드로 전환됩니다.) 하지만 스크립트가 아닌 함수로 만들면 그렇게 하지 마세요!
구문은 case
조건이 특정 변수의 값을 기반으로 한다는 것을 더 명확하게 표현합니다.
#!/bin/sh
editor=$1 file=$2
case "$editor" in
g) exec geany "$file".tex;;
*)
linha=$(wc -l < "$file".tex)
exec texstudio --line "$linha" "$file.tex";;
esac