Index.shファイル:
#!/bin/sh
source "global.sh"
echo "${CODE_DIR}/SOMETHING"
グローバル .sh ファイル:
#!/bin/sh
APP_DIR="/app001/Documents/files/"
CODE_DIR="${APP_DIR}/code"
index.shを実行すると:
予想出力:/app001/Documents/files/code/SOMETHING
出力:/SOMETHINGcuments/files//code
なぜ?この問題を解決するには?
答え1
global.sh
これは、ファイルが行末をキャリッジリターンと改行文字でエンコードするDOSにフォーマットされているために発生します。
Linux / Unixは改行文字を改行文字としてのみ処理するため、キャリッジリターン文字は変数の内容の一部になります${CODE_DIR}
。
キャリッジリターンをエコーすると、カーソルが行の先頭に戻ります。これがこの例で起こるものです。最初に印刷を開始し、/app001/Documents/files//code
その${CODE_DIR}
変数の末尾にあるキャリッジリターンがカーソルを行の先頭に戻し、その部分/SOMETHING
が文字列の先頭を上書きします。
想像できるように、出力をパイピングするとcat -v
すべての文字が表示され、キャリッジリターンは次のように表示されます^M
。
$ ./index.sh | cat -v
/app001/Documents/files//code^M/SOMETHING
この問題を解決するには、改行文字をUnix形式に変換してください。このツール(コンピュータで利用可能な場合)をglobal.sh
使用してください。dos2unix
$ dos2unix global.sh
または、Vimでファイルを開いて変換します。
$ vim global.sh
:set ff=dos
:wq
index.sh
DOS行の終わりがあるかどうか、他のファイルを確認することもできます。global.sh
DOSファイルの終わりが発生する理由を確認して修正することもできます。テキストエディタを使用してこれらのファイルを作成した場合は、テキストエディタが常にUnix行末を使用するように正しく設定されていることを確認してください。