このスクリプトがあります。
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をリダイレクト/パイプする必要があります。