68

ディレクトリに入ろうとしています/cygdrive/c/Users/my dir/Documents

$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my\ dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my\: No such file or directory

$ cd /cygdrive/c/Users/my\ dir/Documents
(success)

手動で入力すると、バックスペースはエスケープ文字を実行しますが、変数でパラメーター展開を使用するとそうではありませんDOCS

バックスラッシュなしなど、他のバリエーションを試しました。

$ DOCS=/cygdrive/c/Users\ dir/Documents

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory

また

$ DOCS="/cygdrive/c/Users/my dir/Documents"

$ echo $DOCS
/cygdrive/c/Users/my dir/Documents

$ cd $DOCS
-bash: cd: /cygdrive/c/Users/my: No such file or directory

同じことが次の場合にも起こり$HOMEます。

$ echo $HOME
/home/my dir

cd $HOMEどちらも機能しません。引用符で囲む必要があります。

なんてこった:

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""

$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"

$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory
4

15 に答える 15

68
$ cd "$DOCS"

"$DOCS"スペースが単語区切りとして解析されないようにするには、引用符を付ける必要があります。多くの場合、変数参照は引用符で囲む必要があります。

$HOME同じ問題が発生することに注意してください。この問題は、シェルが変数参照を評価するときに発生します。どの変数を使用するか、どのように割り当てるかは関係ありません。引用する必要があるのは展開です。

$ echo $HOME
/home/my dir

これは欺瞞的です。echoは実際には 2 つの文字列/home/myと をエコーし​​ていますdir。実際に使ってみると、どのように動いているcdかがわかります。ls

$ ls $HOME
ls: cannot access /home/my: No such file or directory
ls: cannot access dir: No such file or directory
$ cd $HOME
bash: cd: /home/my: No such file or directory
$ cd "$HOME"
<success!>

変数ではなく手動で入力すると機能する理由を尋ねることができますか?

素晴らしい質問です。入力したコマンドを調べてみましょう。

$ DOCS="\"/cygdrive/c/Users/my dir/Documents\""
$ echo $DOCS
"/cygdrive/c/Users/my dir/Documents"
$ cd $DOCS
-bash: cd: "/cygdrive/c/Users/my: No such file or directory

これが機能しない理由は、Bash が変数展開内の引用符を解析しないためです。単語分割を実行するため、引用符で囲まれていない変数展開の空白は単語区切りとして使用されます。つまり、変数内に二重引用符を入れて単語分割をオーバーライドすることはできません

$ cd $DOCS

このため、cd2 つのパラメーターが渡されます。知る限り、cdあなたが書いたように見えます:

$ cd '"/cygdrive/c/Users/my' 'dir/Documents"'

二重引用符はそのままの 2 つのパラメーター。

于 2013-08-19T21:38:44.443 に答える
5
$ DOCS="/cygdrive/c/Users/my\ dir/Documents"

これが最初の問題です。$DOCS次のコマンドを実行して確認できるように、これにより、実際のバックスラッシュ文字が に挿入されます。

$ echo "$DOCS"
/cygdrive/c/Users/my\ `

を定義するときDOCSは、スペース文字をエスケープする必要があります。文字列を (一重引用符または二重引用符を使用して) 引用するかバックスラッシュでスペース文字だけをエスケープすることができます。両方を行うことはできません。(ほとんどの Unix ライクなシステムでは、ファイルまたはディレクトリ名にバックスラッシュを使用できますが、これは良い考えではありません。Cygwin または Windows では、\はディレクトリ区切り文字です。ただし、ディレクトリの実際の名前を想定します。ではmy dirありませんmy\ dir。)

$ cd $DOCS

これは に 2 つの引数を渡しますcd。1 つ目はcygdrive/c/Users/my\、2 つ目はdir/Documentsです。cdエラーメッセージを説明する最初の引数以外を静かに無視することが起こります:

-bash: cd: /cygdrive/c/Users/my\: No such file or directory

$DOCSディレクトリの名前に設定するにはDocuments、次のいずれかを実行します。

$ DOCS="/cygdrive/c/Users/my dir/Documents"
$ DOCS='/cygdrive/c/Users/my dir/Documents'
$ DOCS=/cygdrive/c/Users/my\ dir/Documents

それが完了したら、Documentsディレクトリに移動するには、変数参照を二重引用符で囲みます (値に変な文字が含まれていないことが確実でない限り、bash の変数参照にはこれをお勧めします)

$ cd "$DOCS"

また、そのディレクトリにスペースを含まない名前を付けることを検討することもできますが、これは一般的に Windows では難しい場合があります。

于 2013-08-19T22:11:14.427 に答える
1

c:\から移動してに移動したい場合はc:\Documents and settings、console: に書き込むc:\Documents\[space]+tabと、cygwin は次のようにオートコンプリートします。c:\Documents\ and\ settings/

于 2015-09-30T15:34:22.607 に答える
1

Cygwin has issue recognizing space in between the PC name. So to solve this, you have to use "\" after the first word then include the space, then the last name.

such as ".../my\ dir/"

$ cd /cygdrive/c/Users/my\ dir/Documents

Another interesting and simple way to do it, is to put the directory in quotation marks ("")

e.g run it as follows:

$ cd c:
$ cd Users
$ cd "my dir"
$ cd Documents

Hope it works?

于 2019-05-07T19:52:00.047 に答える
0

わかりました、私もこの問題でイライラする時間を過ごしました。私の小さなガイド。

たとえば、デスクトップを開きます。cmd でディスクを切り替えなかった場合は、次のように入力します。

CDデスクトップ

サブフォルダーを表示する場合は、次のようにします。

cd 、スペースバーを 1 つ作成し、タブを2 回押します

ここで、 SPACE IN NAMEでディレクトリ/ファイルを入力したい場合。ファイル名fg を開きます。開くには、次のように入力する必要があります。

CDファイル\名

ps スラッシュの後にこのスペースがあることに注意してください :)

于 2016-06-25T14:36:43.973 に答える
-2

それ以外の:

DOCS="/cygdrive/c/Users/my\ dir/Documents"

試す:

DOCS="/cygdrive/c/Users/my dir/Documents" 

これは、どのPOSIXシステムでも機能するはずです。

于 2013-08-19T21:37:43.500 に答える