このスクリプトがあります。
echo $HOME
cd $HOME
cd /
cd /usr/local/src/
このように走ってみると
. script.sh
私は次のような結果を得ます。
/home/user
: No such file or directory
: No such file or directory
: No such file or directory
正常に実行すると(#!/bin/bash
最初の行の前に追加します)
sh script.sh
私は次のような結果を得ます。
: not found.sh: 2: script.sh
/home/user
script.sh: 3: Can't cd to /home/user
script.sh: 4: Can't cd to /
script.sh: 5: Can't cd to /usr/local/src/
$HOME
スクリプトは毎回ディレクトリで実行されます。シェルで各コマンドを 1 つずつ実行すると、問題なく実行されます(cd $HOME
内部で呼び出しても$HOME
ディレクトリはまったく変わりません)。
これを行うにはどうすればよいですか?
答え1
スクリプトにCR(^ M)文字があります。 Unix 行末 (LF のみ) を持つように変換します。移植可能な方法で:
tr -d '\r' < your_script > output_script
CR文字で何が起こっているのかについてOlivier Dulacの意見に基づいたいくつかの説明:まず、シェル言語では、CR文字は特殊文字とは見なされません。たとえば、空白とみなされず、無視されません。私は次のように書いています^M
。
この行では、改行文字が続く内容が出力されます
echo $HOME^M
。 CR文字を出力すると、カーソルが最初の列に配置されますが、後に改行文字が続くため、目立つ効果はありません。$HOME
^M
この
cd $HOME^M
行では、文字とCR文字の間にスペースがないため、両方とも$HOME
同じパラメータにあり、$HOME^M
ディレクトリは存在しません。エラーメッセージで$HOME
次のCR文字を印刷し、最初の列にカーソルを置き、行の先頭がメッセージの残りの部分(存在する場合)で上書きされるようにします。 ":そのファイルまたはディレクトリはありません。" with bash(最初の例)、ダッシュなし(2番目の例はsh script.sh
スクリプト#!/bin/bash
の実行を明示的に要求したため無視されますsh
。あなたの場合はダッシュとして表示されます)。エラーメッセージは完全にシェルによって異なります。たとえば、zsh は CR 文字が印刷できないことを検出し、次のメッセージを印刷します。CD:そのファイルまたはディレクトリはありません:/usr/local/src/^M
(CR文字の代わりに「^」と「M」文字を使用してください。)これにより、人々が問題の原因を見つけやすくなります。それ以外の場合は、cat -ve
Olivierが提案した特殊文字を表示できるユーティリティまたはストリームのバイトシーケンスを提供するhd
ようにstderrをリダイレクト/パイプする必要があります。
答え2
以下を使用すると、set -x
ファイルのインポートが失敗する理由がわかります。
$ . test.sh
+ . test.sh
++ echo $'/home/braiam\r'
/home/braiam
++ cd $'/home/braiam\r'
: No such file or directory
++ cd $'/\r'
: No such file or directory
++ cd $'/usr/local/src/\r'
: No such file or directory
vinc17が言ったように、\r
このスクリプトの一部を削除してください。あなたはそれを使用することができます彼の解決策、またはdos2unix script.sh
次を使用します。sed -i 's/\r//' script.sh
答え3
次のコマンドを使用してCR文字を削除することもできます。
perl -p -i -e "s/\r//g" script.sh
使用する場合肉/ウィム、あなたはこれを行うことができます
:set ff=unix
答え4
私も同じ問題があり、EOL文字をUNIX形式に変換して問題を解決しました。簡単な方法は次のとおりです。
- Notepad ++にファイルをロードする
- 変換するすべてのテキストを選択(Ctrl + A)
- 編集> EOL変換> UNIX
- 文書を保存
すでにUNIX形式の場合は、別の形式(Windows)を選択してUNIXに戻ります。