コマンド置換コマンドでstderr警告メッセージを抑制する方法は?

コマンド置換コマンドでstderr警告メッセージを抑制する方法は?
touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\') 2> /dev/null

fooはディレクトリです。

fooのフルパス名を読み込み、ファイルとして生成し、すべての "/"を "\"に置き換え、ディレクトリがファイルを /home/test/foo生成できるようにディレクトリを前に置くことです。directory_\home\test\foo

警告を印刷し続けることを除いて、私が望むことを正確に行います。tr: warning: an unescaped backslash at end of string is not portable

ㅏ。どういう意味なのかわかりません。

stderrをリダイレクトしようとしましたが、/dev/null成功しませんでした。どうやってキャンセルしますか?

答え1

エラーメッセージは、エスケープされていないバックスラッシュがあることを意味します。 *nix 世界では特殊文字の前にバックスラッシュを付けて「エスケープ」できます。つまり、特殊文字ではなく単純文字として解釈されます。たとえば、

$ printf 'foo\nbar'
foo
bar

\n改行文字を表す特殊文字です。しかし、スラッシュを離れると、次のような結果が得られます。

$ printf 'foo\\nbar'
foo\nbar

したがって、バックスラッシュをエスケープして削除できます。

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\\')

または、エラー出力をリダイレクトしてtrtouch現在実行中の操作ではありません):

touch ~/deleted/"$(echo "directory_$(readlink -f -- "$1")"|tr '/' '\' 2> /dev/null)

しかし私はそれを強調しなければならない。これは非常に悪い考えです®バックスラッシュを使用してファイル名を作成します。本当。後で解析して処理することは地獄になります。なぜ他のキャラクターを使用しないのですか?

答え2

tr一部の拡張はリダイレクト前に発生するため、コマンドに直接入力する必要があります。

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\' 2> /dev/null)

答え3

二重バックスラッシュで一重引用符を使用すると、エラーは発生しません。

touch ~/deleted/$(echo "directory_"$(readlink -f foo)|tr '/' '\\')

関連情報