スクリプトをインポートすると、「/home/userにCDを移動できません」

スクリプトをインポートすると、「/home/userにCDを移動できません」

このスクリプトがあります。

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 -veOlivierが提案した特殊文字を表示できるユーティリティまたはストリームのバイトシーケンスを提供するhdようにstderrをリダイレクト/パイプする必要があります。

おすすめ記事