web-dev-qa-db-ja.com

cdコマンドに渡される括弧を保護するにはどうすればよいですか?

here スペースを保護するcdの作成方法を尋ねました。タブ補完は素晴らしいですが、クリップボードからパスを貼り付けると便利な場合があります。

ただし、ソリューションは括弧で中断されます。どのように入力をエスケープして保護しようとしても、常に返される入力:

bash: syntax error near unexpected token `('

括弧も処理する方法はありますか?私が欲しいのは、これを入力すると動作することです:

cd My path with spaces (and parentheses)
21
Strapakowsky

引数を単一引用符'で囲みます。 (これは、cdだけでなく、どのコマンドでも機能します)。

cd 'My path with spaces (and parentheses)'

Bashでcdに括弧を渡すことはできません。スペースをまったく機能させることは、非常に専門的なハックです。

単一引用符は、'自体を除くすべての文字を回避します。単一引用符を4文字のシーケンス'\''で置き換えます。

cd 'Apostrophe'\''s a pain'

ディレクトリ名がハイフンで始まる場合、これは機能しません。これは、cdコマンドが引数をオプションとして解釈するためです。これを回避するには、ディレクトリ名の前に--を渡します。

https://unix.stackexchange.com/questions/69144/how-do-i-escape-a-sub-directory-name-with-an-ampersand-in-it/69147#69147 を参照してください=詳細については。

別の方法は、コマンドラインで引数を渡す代わりに、シェルにテキストの別の行を読み取らせることです。

Strapakowsky@darkstar ~$ read -r; cd -- "$REPLY"
My path with spaces (and parentheses)
Strapakowsky@darkstar ~/My path with spaces (and parentheses)$ 

手動でコピーアンドペーストするのではなく、プログラムで行うこともできます。 xclip または xsel のいずれかをインストールします。

cd -- "$(xclip -o -selection clipboard)"
cd -- "$(xsel -bo)"

これをエイリアスにすることができます。

alias cde='cd -- "$(xsel -bo)"'
23
Gilles

名前にスペースや括弧などの文字が含まれるディレクトリにcdを正しく設定する方法:

フォルダー名に単一引用符文字'が含まれていない場合は、単一引用符で囲んでください。

cd 'My path with spaces (and parentheses)'

'を含むが、二重引用符"、バックスラッシュ\、バッククォート`またはドル$を含まない場合、二重引用符で囲みます。

cd "My path with spaces (and parentheses)"

ファイル名またはディレクトリ名に一重引用符と二重引用符の両方が含まれることはあまりありません。 (これはおそらく、ファイル名またはディレクトリ名に二重引用符が含まれないことが一般的であるためです。元々二重引用符をお勧めしなかった唯一の理由は、単一引用符とは異なり、二重引用符で$環境変数を展開します。これは、ファイル名に$文字とそれに続くテキストが含まれている場合に問題になります。

両方が含まれている場合、または単に別のメソッドが必要な場合は、バックスラッシュ文字\を前に挿入することにより、各スペースと括弧を手動でエスケープできます。

cd My\ path\ with\ spaces\ \(and parentheses\)

それは迷惑ですが、幸いなことに、シェルはあなたのためにそれをするで、名前の先頭を入力してを押すと TabMyで始まるファイルまたはディレクトリ名が複数ある場合は、展開するためにさらに入力する必要がある場合があります。を押すと Tab 展開できないので、押すことができます Tab もう一度入力すると、これまでに入力したものと一致するファイルのリストが表示されます。次に、一意に一致して展開するために、さらに入力する必要があることがわかります。

または、内部引用符をエスケープできます。たとえば、次のフォルダがあるとします:

Mischa's gardening tips for "home and office"

次を使用できます。

cd Mischa\'s\ gardening\ tips\ for\ \"home\ and\ office\"

しかし、単に使用することもできます:

cd 'Mischa'\''s gardening tips for "home and office"'

バックスラッシュは一重引用符の中では特別なものではないので、一重引用符で囲まれた文字列を終了し、バックスラッシュで保護された一重引用符を追加し、別の引数を開始するスペースなしですぐに別の一重引用符で囲まれた文字列を開始します。

おそらくcdを思いどおりに機能させることができない理由:

cd My path with spaces (and parentheses)を機能させることに関して:いいえ、あなたは本当にそれを行うことはできません。この動作はcdコマンドに固有ではないため、コマンドの実行方法の一部です。コマンドを実行すると、ユーザーが提供する引数のリストが提供されます。シェルはスペースを見つけると、1つの引数が終了し、別の引数が開始されたことを認識します。引数の一部としてスペースを渡すには、上記のいずれかの方法で引用符で囲む必要があります。

partの達成someの達成--- cd My path with spacesフォルダーをMy path with spacesフォルダーに移動させることができます。これを実現するには、ユーザーが指定したすべての引数をスペースで連結するシェルスクリプトを作成します。 (その後、cdという名前のシェルエイリアスを作成することで、cd自体がそのスクリプトを呼び出すようにすることができます。これは、現在使用しているシェルビルトインcdよりも優先されます。実行中。)しかし:

  • スクリプトはMy path with spacesMy path with spacesに対して異なる引数を受け取らないので、cd My path with spacesは失敗するか、間違ったフォルダーを入力します。

  • 括弧に対してこれを行うことはできません。これらは、コマンドによる通信が一切行われないように、シェルによるグループ化に使用されるためです。実際、ほとんどの場合、シェルは単純に構文エラーをスローします(これまで見てきたとおり)。

    ek@Kip:~$ cd My path with spaces (and parentheses)
    bash: syntax error near unexpected token `('
    

    何を変更しても、そのコマンドが指定されると、構文エラーが引き続き発生します。

私はあなたが「たぶん」この仕事をすることができないと言います、なぜならあなたが望むように振る舞うあなた自身のシェルを作ることができる1つの方法があるからです。しかし、これは非常に難しく、この変更を行うためだけに誰もがそうしたいとは思わないでしょう。 (既存のシェルのソースコードを変更することもできます。これは、より実用的なソリューションですが、ほとんどの人が望んでいるよりも多くの労力を必要とします。)それに加えて、cdが任意のディレクトリ名を受け入れる可能性は低いですWindowsの場合と同様に、スペースを含む文字。

これがWindowsでは機能するがUbuntuでは機能しない理由を知りたい場合:Windowsでは、コマンドにはtext of textとして入力されたテキストが渡され、コマンドがそのストリングを一連の個別の引数(通常は必ずではありませんが)、コマンドのコードは、コマンドライン文字列を解析する特別なライブラリ関数を呼び出す必要があります。 (Cプログラムでは、これはバックグラウンドで行われますが、Windows APIを使用する必要があります。)

6
Eliah Kagan