質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Kali Linux

Kali Linuxは、DebianベースのLinuxディストリビューションです。ペネトレーションテストを主な目的とし、250以上の専用ソフトウェアがインストールされています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

716閲覧

Linux:locateコマンドで引数に「*」用いたときの挙動について

miiiiiiiiiiiiii

総合スコア1

Kali Linux

Kali Linuxは、DebianベースのLinuxディストリビューションです。ペネトレーションテストを主な目的とし、250以上の専用ソフトウェアがインストールされています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2021/04/28 02:18

前提・実現したいこと

Linux超初心者です。
locateコマンド実行の際に、引数をppleと'pple'にした場合で検索結果が異なる理由についておしえていただきたいです。

発生している問題・エラーメッセージ

① $ locate pple で実行した場合、7行ほどの検索結果は表示される。
② $ locate 'pple'で実行した場合、①の倍以上の検索結果が表示される。
②の結果で表示されたパス内のディレクトリには、読み取り権と実行権があることは確認しました。
''(クォーテーション)で囲んだ場合に異なる出力になるのはどのような事が原因なのでしょうか?

また、locateコマンドやfindコマンドで引数を指定する場合、「''」で囲むのと「""」で囲むのは何か違いはあるのかも教えていただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コマンドラインに、クォートされていないワイルドカード(*とか?とか他にも)があった場合は、それにマッチしたファイルがあった場合は、そのファイル名(複数かも知れない)と置き換わってから実行されます。

ls *pple*を実行してみてください。エラーにならずに、例えばapple.txtと表示されたとすると、
locate *pple*は、locate apple.txtとして実行されます。
そういうファイルはないというエラーなら、locate *pple*locate "*pple*"は同じです。

どのコマンドでも同じなので、echo *.txtとか、echo a*とか、いろいろやってみてください。

引用符で囲んだ場合は、ファイル名とのマッチはされないので、echo "*.txt"は、そのまま表示されます。locateでも同じです。

"'の違いは調べればいくらでも情報があると思いますが、'の中ではすべてのシェルの特殊文字が無効で、"の中では$による変数展開とかバッククォート文字によるコマンド置換とかが行われるという違いがあります。
ワイルドカードについてはどちらの中でも無効でです。

投稿2021/04/28 03:25

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miiiiiiiiiiiiii

2021/04/28 06:55

ご回答ありがとうございます。 今回コマンドを実行したディレクトリの中に、「apple」というディレクトリを作成してありました(この他に*pple*に当てはまる名前のファイル、ディレクトリはありません)。 よって、①の場合は「*pple*」がシェルによって展開されappleとなり、「locate apple」と同様の実行がなされた。 また、②では*が展開されずにlocateコマンドに引き渡され、apple以外にも*pple*に当てはまるものが全て検索された。そのため①と②では異なる出力結果になった。 上のように理解したのですが、相違はありませんでしょうか?
otn

2021/04/28 13:16

はい。それで合ってます。
miiiiiiiiiiiiii

2021/04/29 23:51

ずっと引っかかっていたところが、すとんと腑に落ちました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問