echo -eのエスケープ文字

echo -eのエスケープ文字

.bashrcログに使用するファイルの内容は次のとおりです。

function log(){

  RED="\e[0;31m"
  RESET="\e[0m"
  echo -e "${RED}$(date)" "${RESET}$*" >> "$HOME"/mylog.txt
}

ただし、アポストロフィを使用して操作を実行すると、ある種のヒントが表示され、正しく記録されません。

ファイルに入力されたすべてのテキストをどのようにエスケープできますか?

例:

$ log this is a testing's post
> hello
> 
> ^C
$

ありがとうございます。

答え1

echo -eあなたが経験している問題はあなたのlog()機能とは関係ありません。問題はアポストロフィです。

log this is a testing's post

シェル(あなたの場合はbash)は特定の文字に対して特別な意味を持ちます。アポストロフィ(一重引用符)は文字列全体を引用するために使用され、他のほとんどの種類の補間を防ぎます。bashは彼らがペアで来たいと思っています。これが、2番目のプロンプト行を入力するまで追加のプロンプト行が表示される理由です。文字列に単一引用符を使用するには、\'次のようにエスケープして bash に通知する必要があります。

log this is a testing\'s post

繰り返しますが、logそれはポイントではありません。echo必要に応じて、従来の方法で試してみることができます。

echo this is a testing\'s post

バラよりBashでエスケープする必要がある文字より多くの情報を知りたいです。

答え2

問題は、入力したコマンドラインに一致しない一重引用符文字が含まれているためです。とは何の関係もありませんecho。シェルは2番目のプロンプトを発行して、次に始まる一重引用符文字列が終わるのを待っていることを知らせます。's po...

'関数に自由に渡すにはエスケープする必要がありますlog

log "this is a testing's post"

または:

log this is a testing\'s post

例えば。

今必要な場所に脱出する文字はecho -eバックスラッシュ文字です。たとえば、呼び出すとlog '\begin'BS\b文字に変換されますecho -e

この問題を解決するには、エスケープシーケンスを\e拡張エスケープシーケンスと共に次の変数に保存できます。

log() {
  RED=$'\e[0;31m'
  RESET=$'\e[0m'
  printf '%s\n' "${RED}$(date) ${RESET}$*" >> "$HOME"/mylog.txt
}

(まだPOSIXを採用していない構文を示すには、ここでbashksh93またはFreeBSD構文を使用mkshしてください。)zshsh$'...'

または、次の構文を使用してください。

log() {
  RED='\e[0;31m'
  RESET='\e[0m'
  printf '%b%s%b %s\n' "$RED" "$(date)" "$RESET" "$*" >> "$HOME"/mylog.txt
}

の拡張はの"$*"現在の値によって異なります$IFS

いずれにせよ、echoランダムなデータは避けるのが最善です

関連情報