18

このコマンドは成功します

$ PS1='$(日付 +%s) $ '
1391380852 $

ただし、改行を追加すると失敗します

$ PS1='$(日付 +%s)\n$ '
bash: コマンド置換: 1 行目: 予期しないトークン `)' 付近で構文エラーが発生しました
bash: コマンド置換: 1 行目: `date +%s)'

バックティックを使用すると機能します

$ PS1='`日付 +%s`\n$ '
1391381008
$

ただし、バッククォートは推奨されません。では、このエラーの原因は何ですか?

GNU bash、バージョン 4.2.45(6) リリース
4

3 に答える 3

25

このようなバグに遭遇するのを防ぐために、解析を簡単に明確にすることができます (ただし、自分で再現することはできません)。

PS1='$(date +%s)'$'\n$ '

この$'\n'構文はリテラルの改行文字に解析されますが、2 文字のエスケープ シーケンス'\n'を含む文字列に解析されます。\n

(バックスラッシュでエスケープされたシーケンスの展開)との$''違いの詳細については、 Bash Hackers Wikiを参照してください。''

于 2014-02-04T19:37:01.647 に答える
3

.git-promptWindowsのbash(MSYS2)でPS1に含めようとしたときに、同様の問題が発生しました。問題は\n、それを削除するとすべてがスムーズに実行されますが、ブレークラインが必要です。

ちなみに、Linux ではすべて正常に動作しています。

bash実行されるのは次のとおりです。4.3.42(5)-release (x86_64-pc-msys)

古い、問題のある PS1:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")\nλ \e[0m\]$(tput sgr0)'

修理済み:

PS1='\e[32m\]\u@\h \e[36m\]\w \e[32m\]$(__git_ps1 "(%s)")'$'\nλ \e[0m\]'

簡易版(色なし、コピー&ペースト編集):

PS1='\u@\h \w $(__git_ps1 "(%s)")'$'\n$ '

問題を見つけたチャールズ・ダフィーに乾杯!

于 2016-05-26T14:38:18.990 に答える