パラメータの選択に応じてエディタでファイルを開くスクリプト

パラメータの選択に応じてエディタでファイルを開くスクリプト

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

  1. 末尾の空白は、実際には引数(シェルで解釈されたり解釈されたりしない可能性があります)を読み取るためのコマンド(たとえば)であるif [ため、必要です。を使用すると、シェルの内部ロジックが使用されます(新しいプロセスが開始されないため、より高速です)。シェルは組み込み関数として解釈できますが、 を使用してこの機能をオフにすることができます(実際には新しいプロセスを開始できます)。[test[[[testenable

  2. =比較演算子です~へしかし、他の場所では代入演算子でもあります。とtest=POSIX規格ですが、POSIX規格を追求しない限り==(で識別される[[)を使用するのが合理的な選択肢のようです。これは、シェルコンテキスト依存の意味の不一致をより完全にするためです=

  3. 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

関連情報