シェルの「引用」コマンド


15

コマンドの使用法は何quoteですか?私はそれに関する情報を見つけていません、それは/binフォルダー内の実行可能ファイルの中にありません、そしてそれはBashビルトインの中に見つけることができません。echoコマンドのように、最初のパラメーターのみを出力するようです。


それだけで、引用符追加
ハキームワッハーブ

1
ちょっと調べてみると、quoteに似ているshell-quoteと呼ばれるユーティリティが見つかりましたが、sshやbashスクリプトのデバッグなどに使用できます。ここに脚注として含めたいと思いました。「linux.die.net/man/1/shell-quote
ジョー

quoteこのようなあいまいな目的に使用される、WTFのような一般的な単語を持っているように感じます。これは少し気がかりです。
ハイド14年

母国語が英語ではない人にとって、それはさらにあいまいになります。私のように。:)
whtyger 14年

回答:


10

それは何ですか?

私はこのコマンドが私のシェル(fish、friendly interactive shell)では機能しないことに気付きました。bash(Ubuntuのデフォルト)でのみ動作するようです。

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

それは何をするためのものか?何に使用できますか?

引用符は追加しますが、改行は追加しません。また、bashに適した方法で単一引用符をエスケープします。スクリプトでは、変数または他の種類の文字列を引用するのに役立ちます。これは、たとえばスペースを含むパス/パラメーターに必要です。これを行う方法は他にもありますが。

(Webで)それに関するドキュメントを見つけることができなかったのは本当に奇妙です。しかし、まあ、それが何をするかは簡単にわかります。


2
which対話型シェルでもスクリプトでも役に立たない。type代わりに使用してください。type quote関数であることがわかり、関数定義も表示されます。ビルトインhelp typeでさらに実行しますtype
ガイラ

あなたは正しい、ありがとう。タイプを使用してそれが何であるかを見つける上記の答えを見ました。さて、 'which'のおかげで、パスを返さなかったため、/ bin /にある実行可能ファイルではないことがわかりました。私はそれがまだ有用だと思います。しかし、あなたは正しいです、私はタイプを追加します。
verpfeilt

2
私のUbuntu 12.04では、この機能は実際に説明/etc/bash_completionされ~/.bashrcています。これは、デフォルトでソースになっています/etc/bash.bashrc。関連するセクション/etc/bash_completionがコメントアウトされている場所ではありません。また、/usr/share/bash-completion/フォルダーはUbuntu 12.04にありません。
-whtyger

8

quoteは、ファイル内/usr/share/bash-completion/bash_completionで定義されている関数です(ここでは私のDebianシステム上ですが、Ubuntu上でも同じだと思います)/etc/bash.bashrc

私はこの機能を決して使用しません!シェルで安全に使用できるように引用する必要がある場合printfは、%q修飾子とともに次のように使用してください。

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

実際、これは非常にまれにしか使用されませんが、私たちユーザーが通常行うように、常に高レベルのもののためのより良い戦略があります。このquoteことは、私たちが知りたくない不明瞭なものによって内部的に使用されます。このquote関数はおそらくベンダー/ディストリビューション固有のもので(Debian固有のものを読んでください)、おそらくまったく移植性がなく、将来のリリースでも変更される可能性があります。

編集。Ubuntu 12.04システムで確認したところ、quote関数はで定義され/etc/bash_completion、ソースが/etc/bash.bashrc、それ自体がソース/etc/profileです。

これをどのように決定しましたか?少しヒューリスティックを使用して:

  • quote表示されるかどうかを確認します/etc/profile

    grep '\bquote\b' /etc/profile

    いいえ。次のステップに進みます。

  • 提供元のファイルは何/etc/profileですか?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    私が持っている$i(何このソースのソースを検討する必要性が、しかしこの場合は、ファイルだ/etc/profile.d/*.shがあれば(と読める場合)/etc/bash.bashrc。で見ます/etc/bash.bashrc

  • あるquote/etc/bash.bashrc?yes / noなど

quote実際に単一引用符をエスケープするため、シェルで使用できます。それはちょうど同様に動作しますprintf %q。このユースケースのために。
フリム

@Flimmは自己責任で使用してください!
gniourf_gniourf

@gniourf_gniourf printf%qはチルダ()を適切に処理しないと思います。これを試してくださいmy_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")"。あなたのようなものを見るだろうExpected: ~/.bashrcquote: ~/.bashrcprintf %q: /home/your_username/.bashrc
Rockallite

1
@Rockallite:私はちょうどそれを試してみましたが、それが予想される...作品
gniourf_gniourf

ソースに直接スキップする場合は(shopt -s extdebug; declare -F quote)、を使用して、関数名、定義されている行番号、定義されているファイル名を確認できます
。– wjandrea

3

quote 関数です:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

この関数は、bash初期化ファイルのどこかに定義されています。より正確には、Ubuntu 13.04を使用している場合/usr/share/bash-completion/bash_completion、142行目で見つけることができます。

次のコマンドを使用して確認します。

type quote

その目的は明らかに明らかです。


それがすることは明らかです-しかし、なぜあなたがそれをしたいのかはわかりません。誤解を避けるために、$INPUTスペース、引用符、または他の文字を含む可能性のある変数を取得し、bashによって単一の引数としてのみ扱われる文字列を返すために使用されます。
ベンXO
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.