私は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/sh
Makeはデフォルトで使用されているシェルを介してコマンドを実行するか、Debianではダッシュを実行します。 Dashの組み込み機能はecho
バックスラッシュを処理します。バッシュはそうではありません。 (/bin/echo
明示的に実行しない限り、Debianの外部は重要ではありません/bin/echo
。)
最良のオプションは明示的に使用することですprintf
。これは常にバックスラッシュエスケープを処理するので、少なくとも安全です。以下は常に同じことを行う必要があります。つまり、先頭\\n
に実際のバックスラッシュを作成し、行の末尾にn
改行文字を生成する必要があります。\n
foo:
printf '\\newcommand\n' > foo
(またはご希望の場合避けるバックスラッシュを処理した後printf "%s" '\newcommand'
)
問題を見るなぜprintfがechoより優れているのですか?トラップの詳細echo
。