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 '/' '\\')
または、エラー出力をリダイレクトしてtr
(touch
現在実行中の操作ではありません):
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 '/' '\\')