スクリプトをインポートすると、「/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をリダイレクト/パイプする必要があります。

答え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に戻ります。

関連情報