MacOS XでBashを使用していますが、実行時に別のディレクトリに変更する単純な実行可能スクリプトファイルを作成したいと思います。ただし、そのディレクトリへのパスにはスペースが含まれています。一体どうやってこれをするの?これは私が持っているものです...
ファイルの名前:cdcode
ファイルの内容:
cd ~/My Code
当然のことながら、これは長いパス名ではありませんが、実際のパス名は深さが5つのディレクトリで、そのうち4つのディレクトリにはパスにスペースが含まれています。
ところで、私はcd "~/My Code"
およびcd "~/My\ Code"
そして、どちらも機能しませんでした。
パスを二重引用符で囲むと、チルダの展開が停止します。そのため、これを行うにはいくつかの方法があります。
cd ~/"My Code"
cd ~/'My Code'
ここではチルダは引用されていないため、チルダの展開は引き続き実行されます。
cd "$HOME/My Code"
二重引用符で囲まれた文字列内の環境変数を展開できます。これは基本的にチルダ展開が行っていることです
cd ~/My\ Code
バックスラッシュを使用して、特殊文字(スペースなど)をエスケープすることもできます。
cd ~/My\ Code
私にとってはうまくいくようです...引用符を削除してもスラッシュを維持できない場合、サンプルコードを投稿できますか?
次のいずれかを使用できます。
cd ~/"My Code"
cd ~/M"y Code"
cd ~/My" Code"
使用できません:
cd ~"/My Code"
最初の例は、シェルが〜/を$ HOME /に展開し、二重引用符なしでMy Codeを追加するために機能します。 2番目は、マップする"
に対して '~"
'(二重引用符)と呼ばれるユーザーがいないため失敗します。
私にとっては単一のバックスラッシュが機能します:
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
問題は、シェルスクリプトがそのサブシェルのディレクトリを変更しているのではなく、完了したらメインシェル(および元のディレクトリ)に戻っているということですか?を使用して回避しました。現在のシェルでスクリプトを実行しますが、ほとんどの人はこのエイリアスを使用します。スペースは赤いニシンかもしれません。
同じ問題に苦労した後、私は機能する2つの異なるソリューションを試しました。
""
)変数を使用します。最も簡単な方法は、前の回答で指摘したように変数を二重引用符で囲むだけです:
cd "$yourPathWithBlankSpace"
eval
を使用します。この回答によると、 スペースをエスケープするUNIXコマンド 空白を削除してから、次のようにeval
を使用できます。
yourPathEscaped=$(printf %q "$yourPathWithBlankSpace")
eval cd $yourPathEscaped
スクリプトでは〜を避けます。代わりに$ HOMEを使用してください。
これを行う非常に簡単な方法は
$ cd My\ Folder
BashでDIRコマンドを実行すると、結果に、間にスペースがあるフォルダー名またはパス名が次のような結果に書き込まれていることがわかります。
$dir
My\ Folder
New\ Folder
二重引用符を使用する
go ()
{
cd "$*"
}
Linuxで作業する場合、次の構文は正しいです。
cd ~/My\ Code
ただし、ファイルを実行するときは、次の構文を使用します。
$ . cdcode
(「./」ではなく「。」のみ)
いくつかのデータをダンプするためにbashスクリプトを使用していた場合、同様の問題が発生しました。最終的に、スクリプトフォルダーにシンボリックリンクを作成し、そこにスペースを入れませんでした。次に、スクリプトにシンボリックリンクを指定しましたが、正常に機能します。
リンクを作成します。 ln -s [ターゲットディレクトリORファイル] ./ [ショートカット]
Mauまたは役に立たない可能性があります。
次のような単一引用符を使用します。
myPath=~/'my dir'
cd $myPath