助け合いフォーラム
LinuC Lv1-101(Ver10.0)
問題ID : 14915
問題を開く
ホームディレクトリに\workディレクトリを作成することができるコマンドはどれか
正解
mkdir ~/\\work
解説
「\(バックスラッシュ)」はシェルによって特別に解釈されるメタキャラクタの1つです。「\」は次に続くメタキャラクタの意味を打ち消して通常の文字として扱います。
以下は主なメタキャラクタをまとめたものです。
設問では名前に「\(バックスラッシュ)」のつくディレクトリを作成したいので、「\」をエスケープする(メタキャラクタとして扱わない)ようにする必要があります。その場合、バックスラッシュを2つつなげることで、「\」を文字として扱うことができます。
よって正解は
・mkdir ~/\\work
です。
以下は実行例です。
その他の選択肢については以下の通りです。
・mkdir ~/\work
「\」に続くメタキャラクタがないため、mkdirコマンドへの引数としては「(ホームディレクトリパス)/work」が渡されます。この場合、『ホームディレクトリに「work」ディレクトリを作成する』ことになるので、誤りです。
・mkdir '~/\\work'
「~/\work」全体を「'(シングル・クォーテイション)」で囲んでいるため、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」と「\」がともに無視され、mkdirコマンドへの引数としては「~/\\work」が渡されます。この場合、『現在のディレクトリで「~」ディレクトリ配下に\\workディレクトリを作成する』ことになるので、誤りです。
・mkdir "~/\\work"
「~/\work」全体を「"(ダブル・クォーテイション)」で囲んでいるため、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」だけが無視され、mkdirコマンドへの引数としては「~/\work」が渡されます。この場合、『現在のディレクトリで「~」ディレクトリ配下に\workディレクトリを作成する』ことになるので、誤りです。
・mkdir ~\\work
mkdirコマンドへの引数としては「~\work」が渡されますが、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」に続けてディレクトリを意味する「/(スラッシュ)」がないため、『現在のディレクトリで「~\work」ディレクトリを作成する』ことになるので、誤りです。
以下はstaffユーザーでの上記コマンドの実行例です。
以下は主なメタキャラクタをまとめたものです。
設問では名前に「\(バックスラッシュ)」のつくディレクトリを作成したいので、「\」をエスケープする(メタキャラクタとして扱わない)ようにする必要があります。その場合、バックスラッシュを2つつなげることで、「\」を文字として扱うことができます。
よって正解は
・mkdir ~/\\work
です。
以下は実行例です。
その他の選択肢については以下の通りです。
・mkdir ~/\work
「\」に続くメタキャラクタがないため、mkdirコマンドへの引数としては「(ホームディレクトリパス)/work」が渡されます。この場合、『ホームディレクトリに「work」ディレクトリを作成する』ことになるので、誤りです。
・mkdir '~/\\work'
「~/\work」全体を「'(シングル・クォーテイション)」で囲んでいるため、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」と「\」がともに無視され、mkdirコマンドへの引数としては「~/\\work」が渡されます。この場合、『現在のディレクトリで「~」ディレクトリ配下に\\workディレクトリを作成する』ことになるので、誤りです。
・mkdir "~/\\work"
「~/\work」全体を「"(ダブル・クォーテイション)」で囲んでいるため、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」だけが無視され、mkdirコマンドへの引数としては「~/\work」が渡されます。この場合、『現在のディレクトリで「~」ディレクトリ配下に\workディレクトリを作成する』ことになるので、誤りです。
・mkdir ~\\work
mkdirコマンドへの引数としては「~\work」が渡されますが、ホームディレクトリを意味するメタキャラクタ「~(チルダ)」に続けてディレクトリを意味する「/(スラッシュ)」がないため、『現在のディレクトリで「~\work」ディレクトリを作成する』ことになるので、誤りです。
以下はstaffユーザーでの上記コマンドの実行例です。
参考
メタキャラクタは、シェルによって特別に解釈される文字です。
以下は主なメタキャラクタとディレクトリ関連の特殊記号をまとめたものです。
例えばechoコマンドの引数に「*」を指定した場合、シェルは「*」を表示せずカレントディレクトリの内容を表示します。これは、シェルが「*」をメタキャラクタとして特別に認識するためです。
$ echo *
file1 file2
シェルがメタキャラクタを通常の文字として扱う(メタキャラクタをエスケープする)ためには、以下のような方法があります。
・「\」(環境によっては「¥」が表示される)をメタキャラクタの直前に付ける
$ echo \*
*
・「'」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo '*'
*
・「"」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo "*"
*
なお、「"」で囲まれた「$」、「`」、「\」、「"」は文字ではなくメタキャラクタとして扱われます。
例)
$ DATE=date
$ echo "$DATE"
date
「"」で囲まれていても「$」はメタキャラクタとして扱われるため、「$DATE」とは表示されず、変数に格納されている値が表示されます。
つまり、「echo "$DATE"」と「echo $DATE」の実行結果は同じです。
例)
$ echo "`date`"
2012年 1月 12日 木曜日 15:00:40 MST
「"」で囲まれていても「`」はメタキャラクタとして扱われるため、「`date`」とは表示されず、dateコマンド(現在の日付と時刻を表示)の実行結果が表示されます。
つまり、「echo "`date`"」と「echo `date`」の実行結果は同じです。
以下は主なメタキャラクタとディレクトリ関連の特殊記号をまとめたものです。
例えばechoコマンドの引数に「*」を指定した場合、シェルは「*」を表示せずカレントディレクトリの内容を表示します。これは、シェルが「*」をメタキャラクタとして特別に認識するためです。
$ echo *
file1 file2
シェルがメタキャラクタを通常の文字として扱う(メタキャラクタをエスケープする)ためには、以下のような方法があります。
・「\」(環境によっては「¥」が表示される)をメタキャラクタの直前に付ける
$ echo \*
*
・「'」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo '*'
*
・「"」でメタキャラクタまたはメタキャラクタを含む文字列を囲む
$ echo "*"
*
なお、「"」で囲まれた「$」、「`」、「\」、「"」は文字ではなくメタキャラクタとして扱われます。
例)
$ DATE=date
$ echo "$DATE"
date
「"」で囲まれていても「$」はメタキャラクタとして扱われるため、「$DATE」とは表示されず、変数に格納されている値が表示されます。
つまり、「echo "$DATE"」と「echo $DATE」の実行結果は同じです。
例)
$ echo "`date`"
2012年 1月 12日 木曜日 15:00:40 MST
「"」で囲まれていても「`」はメタキャラクタとして扱われるため、「`date`」とは表示されず、dateコマンド(現在の日付と時刻を表示)の実行結果が表示されます。
つまり、「echo "`date`"」と「echo `date`」の実行結果は同じです。
mkdir の「/」について
r
ruttey
投稿日 2022/08/12
・mkdir \work\work」が渡されますが、ホームディレクトリを意味するメタキャラクタ「
mkdirコマンドへの引数としては「(チルダ)」に続けてディレクトリを意味する「/(スラッシュ)」がないため、『現在のディレクトリで「\work」ディレクトリを作成する』ことになるので、誤りです。
上記の場合、なぜ「ディレクトリを意味する「/(スラッシュ)」」が必要なのですか?
普通にmkdir でディレクトリを作る場合は、「/」要らないですよね?
2022/08/12 14:45
普通にmkdir でディレクトリを作る場合は、「/」要らないですよね?
設問が
ホームディレクトリに\workディレクトリを作成することができるコマンドはどれか
なので、「ホームディレクトリ」が確実に指定されてないとダメなんじゃないですかね? /
なしだと「現在のディレクトリ」になるので、ホームディレクトリであることが保証できないんじゃないかと。
おそらく mkdir ~\\work
の選択肢のことを聞かれてるのだと思うのですが、 ~
単体だと「ホームディレクトリ」の意味を持ちますが、~\work
だとホームディレクトリの意味が消え失せてしまうのですよね。ホームディレクトリの意味を残すためには ~/
としないとダメ、ってことなんですよね。
コメント
この投稿に対して返信しませんか?
r ruttey
2022/08/12 15:23
理解できました。ありがとうございます。