パス名にスペースがあるディレクトリにcdするBashスクリプト


95

macOS XでBashを使用していますが、実行時に別のディレクトリに移動する単純な実行可能スクリプトファイルを作成したいと考えています。ただし、そのディレクトリへのパスにはスペースが含まれています。どのようにこれを行うのですか?これは私が持っているものです...

ファイル名: cdcode

ファイルの内容:

cd ~/My Code

許可されましたが、これは長いパス名ではありませんが、実際のパス名は5つのディレクトリの深さであり、これらのディレクトリのうち4つはパスにスペースがあります。

ところで、私が試したcd "~/My Code"し、cd "~/My\ Code"どちらもこれらのは、働いていません。


1
説明したのと同様の問題が発生しています。つまり、スペースを含むディレクトリに変更するための可能な方法はありません。次のようなものはありません:cd "My Passport" cd My \ Passport cd My "Passport"何も機能していません。complitionは正常に動作します。リストすることができます:ls -l My \ Passport /は正常に動作します。\> uname -a Linuxホスト2.6.18-8.1.8.el5.centos.plus#1 SMP Mon Jul 16 08:49:50 EDT 2007 i686 i686 i386 GNU / Linux \> bash --help GNU bash、バージョン3.1 .17(1)-release-(i686-redhat-linux-gnu)何かアイデアはありますか?
Denis C

回答:


81

パスを二重引用符で囲むと、チルド拡張が停止します。これを行うにはいくつかの方法があります:

cd ~/"My Code"
cd ~/'My Code'

ここではチルドは引用されていないため、チルド拡張は引き続き実行されます。

cd "$HOME/My Code"

二重引用符で囲まれた文字列内の環境変数を展開できます。これは基本的にチルド拡張が行っていることです

cd ~/My\ Code

スペースなどの特殊文字をバックスラッシュでエスケープすることもできます。


3
〜/ My '' Codeをcdすることもできますが、バックスラッシュでエスケープできるのはばかげています
Nick Dixon

41

私はこのページの下に解決策を見つけました:

x="test\ me"  
eval cd $x

\二重引用符で囲まれたテキスト定数とevalbefore の組み合わせによりcd、魅力的に動作します!


より明確:スクリプトのファイルのディレクトリにcdする場合:DIR = $(dirname "$ 0"); eval cd $ DIR
Michael Scott Cuthbert 2013年

1
これは、OS Xマシンでbashスクリプトを実行するのに非常に役立ちました。🎉
timbillstrom

ここは本当に必要ありませんeval
ベンジャミンW.

2
OS Xでは、他の/以前の答えをなしで機能させることができませんでしたeval
D.ウッズ

10
cd ~/My\ Code

私にとってはうまくいくようです...引用符を削除してもスラッシュを維持してもうまくいかない場合、サンプルコードを投稿できますか?


10

次のいずれかを使用できます。

cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"

次のものは使用できません。

cd ~"/My Code"

最初の方法は、シェルが〜/を$ HOME /に展開し、二重引用符なしでMy Codeを追加するため機能します。マッピングする"ための' '(二重引用符)というユーザーがいないため、2番目は失敗~"します。


9

同じ問題に取り組んだ後、2つの異なる解決策を試しました。

1. ""変数には二重引用符()を使用します。

最も簡単な方法は、前の回答で指摘したように変数を二重引用符で囲むだけです。

cd "$yourPathWithBlankSpace"

2.を利用しevalます。

この回答によると、スペースをエスケープするUnixコマンドではeval、次のように空白を削除してを利用できます。

yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped

4

単一のバックスラッシュが私にとってはうまくいきます:

ry4an@ry4an-mini:~$ mkdir "My Code"

ry4an@ry4an-mini:~$ vi todir.sh

ry4an@ry4an-mini:~$ . todir.sh 

ry4an@ry4an-mini:My Code$ cat ../todir.sh 
#!/bin/sh
cd ~/My\ Code

問題は、シェルスクリプトがサブシェルのディレクトリを変更しているのではなく、完了したらメインシェル(および元のディレクトリ)に戻っていることですか?私はを使用してそれを回避しました。現在のシェルでスクリプトを実行しますが、ほとんどの人はこれにエイリアスを使用します。スペースは赤いニシンである可能性があります。


ありがとう、Ry4an(およびその他の回答者)。スクリプトを誤って実行していたようです。私はそれをそのように実行しようとしていました:%./cdsomedir「。」を使用する必要があることに気付きませんでした。あなたがしたようにスクリプトを実行するには:%。cdsomedir.sh一度実行すると、動作しました。初心者の間違い。ありがとう!


2

Linuxで作業する場合、以下の構文は正しいです:

cd ~/My\ Code

ただし、ファイルを実行するときは、次の構文を使用します。

$ . cdcode

(「./」ではなく「。」のみ)


野生の好奇心から、なぜそれが重要なのですか?「./」が使用されるのを見たことがあります。
クジラ

./は新しいシェルを生成し、ディレクトリを変更します。したがって、スクリプトが終了すると、新しいシェルを起動したシェルに戻ります。〜/ My Codeではなく、スクリプトを実行したディレクトリに移動します。「。」一方、スクリプトはシェルの現在のインスタンスで実行されます。
Alterlife、

ドット「。」「ソース」コマンドのエイリアスであるUNIXコマンドです。ファイル名が続きます。したがって、「source myfile」は現在のシェル内でファイルを実行します。そして「.myfile」も同じことをします。「./」変数は「現在のディレクトリ」を意味し、コマンドではありません。
JPGConnolly

2

二重引用符を使用する

go () 
{ 
    cd "$*"
}

ありがとう。.bashrcスペースを含むディレクトリ名をコマンドラインに貼り付けるときに、スペースをエスケープしたり、全体を引用したりすることなく、ディレクトリを変更するためのファイル内の関数への便利な追加。cdsしかし、より良い名前です。
mattst 2016年

これを(ifなしで)拡張goしてcd、と同等になる、つまりホームディレクトリにcdする方法はありますか?
zennehoy 2017

2

これを行う非常に簡単な方法は、

 $ cd My\ Folder

bashでDIRコマンドを実行すると、結果に次のような結果で、間にスペースがあるフォルダーまたはパス名が書き込まれていることがわかります-

$dir
My\ Folder
New\ Folder

2

これはそれを行います:

cd ~/My\ Code

私はiCloudドライブに保存されているファイルを操作するためにそれを使用しなければなりませんでした。絶対パスである必要があるため、二重引用符( ")は使用しないでください。つまり、二重引用符とチルダ(〜)を組み合わせることはできません。

例として、私はこれを最近のプロジェクトに使用しなければなりませんでした:

cd ~/Library/Mobile\ Documents/com~apple~CloudDocs/Documents/Documents\ -\ My\ iMac/Project

お役に立てば幸いです。


1

いくつかのデータをダンプするためにbashスクリプトを使用していても、同様の問題が発生しました。スクリプトフォルダーにスペースを入れずにシンボリックリンクを作成しました。次に、スクリプトにシンボリックリンクを指定したところ、問題なく動作しました。

リンクを作成します。ln -s [TARGET DIRECTORY OR FILE] ./[SHORTCUT]

マウか役に立たないかもしれません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.