bash / debian:奇妙なメイクファイルの動作

bash / debian:奇妙なメイクファイルの動作

私はTeXで非常に単純なmakefileを使用しています:

test-makefile:
    echo '\newcommand{\seance}{seance1}' > seances/seance.tex

私はそれを実行します:

$ make test-makefile 
echo '\newcommand{\seance}{seance1}' > seances/seance.tex

私の問題は、「seances」というフォルダに作成されたファイルに含める必要がある最初の2文字が含まれていないことです。


ewcommand{\seance}{seance1}

最初の行は空です。

もちろん、最初のバックスラッシュecho '\\newcommand{\seance}{seance1}などを保護できます。しかし、現実の世界では動作しません。私の実際のmakefile(ECMをリリースしました)が動作しません。

どうしたの? bash / debianはどのようにコマンドの冒頭を誤解するのですか?



ちなみに:

$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-pc-linux-gnu)
$ cat /etc/debian_version
buster/sid
$ uname -a
Linux giljourdan 4.16.0-1-amd64 #1 SMP Debian 4.16.5-1 (2018-04-29) x86_64 GNU/Linux

ベストアンサー1

あなたはechoその記述子の一つですバックスラッシュエスケープ。 Aは\n改行を意味するので、アイデアを得ることができます。後者のバックスラッシュは\s有効なエスケープコードではないため、現状のまま表示されます。

/bin/shMakeはデフォルトで使用されているシェルを介してコマンドを実行するか、Debianではダッシュを実行します。 Dashの組み込み機能はechoバックスラッシュを処理します。バッシュはそうではありません。 (/bin/echo明示的に実行しない限り、Debianの外部は重要ではありません/bin/echo。)

最良のオプションは明示的に使用することですprintf。これは常にバックスラッシュエスケープを処理するので、少なくとも安全です。以下は常に同じことを行う必要があります。つまり、先頭\\nに実際のバックスラッシュを作成し、行の末尾にn改行文字を生成する必要があります。\n

foo:
        printf '\\newcommand\n' > foo

(またはご希望の場合避けるバックスラッシュを処理した後printf "%s" '\newcommand'

問題を見るなぜprintfがechoより優れているのですか?トラップの詳細echo

おすすめ記事