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

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

私は尋ねたここ保護スペースを作成する方法cd。タブ補完は便利ですが、クリップボードからパスを貼り付けることもあるので、これは便利です。

ただし、このソリューションは括弧で壊れます。入力をどのようにエスケープして保護しようとしても、常に次の結果が返されます。

bash: syntax error near unexpected token `('

括弧も処理する方法はありますか? 私が望んでいるのは、次のように入力すると機能することです:

cd My path with spaces (and parentheses)

答え1

引数を一重'引用符で囲みます。(これは だけでなく、任意のコマンドに有効ですcd)。

cd 'My path with spaces (and parentheses)'

bash に括弧を に渡すことはできませんcd。スペースを機能させるのは非常に特殊なハックです。

一重引用符は、その引用符自体を除くすべての文字を囲みます'。一重引用符を 4 文字のシーケンスに置き換えます'\''

cd 'Apostrophe'\''s a pain'

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

見る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)$ 

手動でコピー&ペーストするよりも、プログラムで行った方がよいでしょう。xクリップまたはエクセル

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

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

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

答え2

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

フォルダ名に一重引用符が含まれていない場合は'、一重引用符で囲むだけです。

cd 'My path with spaces (and parentheses)'

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

cd "My path with spaces (and parentheses)"

ファイル名やディレクトリ名に一重引用符と二重引用符の両方が含まれることはあまり一般的ではありません。(これは、ファイル名やディレクトリ名に二重引用符がまったく含まれないことが原因と考えられます。二重引用符を最初に推奨しなかった唯一の理由は、一重引用符とは異なり、二重引用符では環境変数を展開できるためです。ファイル名に文字の後にテキストが$含まれている場合、これは問題になります。)$

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

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

それは面倒ですが、幸いなことに、自分のためにやれ、名前の先頭を入力して を押すと、が表示されます。Tabで始まるファイル名またはディレクトリ名が複数ある場合はMy、展開するためにさらに入力する必要がある可能性があります。 を押しても展開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 つの引数が終了し、別の引数が始まったことを認識します。引数の一部としてスペースを渡すには、上記のいずれかの方法で引用符で囲む必要があります。

達成できる一部これのいくつかの多くの場合、フォルダcd My path with spacesに入る作業が必要になりますMy path with spaces。これは、ユーザーが指定した引数をすべてスペースで連結するシェル スクリプトを作成することで実現できます。(その後、必要に応じて、シェルcdエイリアスを作成してそのスクリプトを呼び出すようにすることもできますcd。これは、現在通常実行しているシェル組み込みコマンドよりも優先されますcd。) ただし、

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

  • 括弧についてはこれを行うことはできません。括弧はシェルによってグループ化のために使用されるため、コマンドにはまったく伝達されないからです。実際には、ほとんどの場合、シェルは単に構文エラーをスローします (ご覧のとおり)。

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

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

「おそらく」これを機能させることはできない、と言うのは、それができる方法が 1 つあるからです。それは、希望どおりに動作する独自のシェルを作成することです。しかし、これは非常に難しく、この変更を行うためだけにそれを行いたいと考える人はまずいないでしょう。(既存のシェルのソース コードを変更することもできます。これはより実用的な解決策ですが、それでもほとんどの人が費やしたい以上の労力が必要です。) それに加えて、cdWindows のように、スペースを含む任意の文字を含むディレクトリ名を受け入れることはおそらくできません。

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

関連情報