ディレクトリパスを持つ変数があります。コンテンツを試すとecho
正しいパスが出力されますが、試してみると次のようになりcd
ます/home/user/
。
[user@project]$ echo $PROJECT_DELIVERY
/home/user/projects/ws/project/delivery/project_name_0.1.0
[user@project]$ cd $PROJECT_DELIVERY
: No such file or directoryuser/projects/ws/project/delivery/project_name_0.1.0
内容はこれですprintf %s "$PROJECT_DELIVERY" | xxd
[a27503408@ded30325 install]$ printf %s "$PROJECT_DELIVERY" | xxd
0000000: 2f68 6f6d 652f 6132 3735 3033 3430 382f /home/user/
0000010: 7072 6f6a 6563 7473 2f61 7332 3530 2f41 projects/as250/A
0000020: 5332 3530 5f4d 3135 3533 5f54 4d54 432f S250_M1553_TMTC/
0000030: 6465 6c69 7665 7279 2f41 5332 3530 5f4d delivery/AS250_M
0000040: 3135 3533 5f54 4d54 435f 302e 312e 300d 1553_TMTC_0.1.0.
この動作の原因は何ですか?私はbash 4.1.2(1)を使用しています。
答え1
ディレクトリ名の後にCRがあります。 (0d
16進ダンプの最後の文字と見なされます。)
また、エラーメッセージがディレクトリパスを上書きする理由も説明します。通常あなたは得るでしょう
cd /qwerty
-bash: cd: /qwerty: No such file or directory
ただし、CRやそれに伴うエラーメッセージが重要な情報を上書きするなどの結果が得られます。
cd /qwerty
: No such file or directory
これを証明してください。
echo "$PROJECT_DELIVERY<"
\r
次の構造を使用して末尾の文字を削除できます。
r=$'\r' # Or r=$(printf "\r")
PROJECT_DELIVERY="${PROJECT_DELIVERY%$r}" # Strip the CR from the end
答え2
@Kusalanandaが述べたように、変数には不注意以上の内容が含まれています。エコ出力後に空行を見ましたか?
答え3
実際には '\r' と '\n' 文字があります。以下を使用して削除しました。
VARIABLE="$(echo "$VARIABLE"|tr -d '\n'|tr -d '\r')"