web-dev-qa-db-ja.com

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

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

ファイルの名前:cdcode

ファイルの内容:

cd ~/My Code

当然のことながら、これは長いパス名ではありませんが、実際のパス名は深さが5つのディレクトリで、そのうち4つのディレクトリにはパスにスペースが含まれています。

ところで、私はcd "~/My Code"およびcd "~/My\ Code"そして、どちらも機能しませんでした。

83
Rails Newbie

パスを二重引用符で囲むと、チルダの展開が停止します。そのため、これを行うにはいくつかの方法があります。

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

ここではチルダは引用されていないため、チルダの展開は引き続き実行されます。

cd "$HOME/My Code"

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

cd ~/My\ Code

バックスラッシュを使用して、特殊文字(スペースなど)をエスケープすることもできます。

76
derobert

このページ で以下の解決策を見つけました:

x="test\ me"  
eval cd $x

二重引用符で囲まれたテキスト定数の\evalの前のcdの組み合わせは、それを魅力のように動作させます!

35
user365757
cd ~/My\ Code

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

10
Andrew Flanagan

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

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

使用できません:

cd ~"/My Code"

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

9

私にとっては単一のバックスラッシュが機能します:

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

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

4
Ry4an Brase

同じ問題に苦労した後、私は機能する2つの異なるソリューションを試しました。

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

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

cd "$yourPathWithBlankSpace"

2. evalを使用します。

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

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

スクリプトでは〜を避けます。代わりに$ HOMEを使用してください。

3

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

 $ cd My\ Folder

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

$dir
My\ Folder
New\ Folder
2
Mayukh Datta

二重引用符を使用する

go () 
{ 
    cd "$*"
}
2
Bobo

Linuxで作業する場合、次の構文は正しいです。

cd ~/My\ Code

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

$ . cdcode

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

2
Alterlife

いくつかのデータをダンプするためにbashスクリプトを使用していた場合、同様の問題が発生しました。最終的に、スクリプトフォルダーにシンボリックリンクを作成し、そこにスペースを入れませんでした。次に、スクリプトにシンボリックリンクを指定しましたが、正常に機能します。

リンクを作成します。 ln -s [ターゲットディレクトリORファイル] ./ [ショートカット]

Mauまたは役に立たない可能性があります。

1
Alexis

次のような単一引用符を使用します。

myPath=~/'my dir'

cd $myPath
0
Jadian