web-dev-qa-db-ja.com

シェルコマンドラインでの。(1つのピリオド)&..(2つのピリオド)の使用方法

単一のピリオド.は現在の作業ディレクトリを意味します

二重ピリオド..は、現在の作業ディレクトリの親を意味します

考えられるのは.相対パス名などで使用されていますcd ./bin/usr

上記はどうですか...シェルコマンドラインで使用

6
Computernerd

上記はどうですか。 &..Shellコマンドラインで使用

状況に応じて多くの点で。シンプルなイラスト:

  • 例えばあなたが言ったような組み込みのcdコマンドでのパス解決のために
  • Literally、パターン内、たとえばパス名展開のコンテキスト
  • patternでは、1文字をgrepのようなコマンドで置き換えます

組み込みのcdコマンドが内部でどのように機能するかについて、man cdman path_resolutionおよびこれ 説明 を検討してください(ここではman cd):

(4)。ディレクトリオペランドの最初のコンポーネントがドットまたはドットドットの場合は、手順6に進みます。

(6)。 curpathを、PWDの値、スラッシュ文字、およびオペランドの連結によって形成される文字列に設定します。

(8)。次にcurpath値は、各コンポーネントを最初から最後まで順番に考慮して、次のように正規形式に変換されます。

a。ドットコンポーネントと、それらを次のコンポーネントから分離するスラッシュは削除されます。

b。各ドットドットコンポーネントについて、先行するコンポーネントがあり、それがルートでもドットドットでもない場合、先行するコンポーネント、ドットドット、ドットドットから先行するコンポーネントを区切るすべてのスラッシュ、およびドットドットを区切るすべてのスラッシュ以下のコンポーネントを削除します。 ...

これは、上記の手順がディレクトリを/home/userから../../boot/memtest86に変更する場合にどのように適用されるかのステップバイステップの例です。

# echo $PWD
/home/user
(4). cd ../../boot/memtest86
(6). curpath = /home/user/../../boot/memtest86
(8)b 
/home/user/../../boot/memtest86
/home/../boot/memtest86   //step 1
/        boot/memtest86   //step 2
curpath = /boot/memtest86 //result

作業ディレクトリの深さと同じ程度にドットコンポーネントをトリミングすると、必然的にルートから表現されたパスが生成されます。上記のように連結するため、単一のドットケースなどの手順はスキップされ、現在のディレクトリにいるので想像しやすい./が削除されます。これは、現在のディレクトリと親ディレクトリを参照する...が、このコマンドのコンテキスト内でどのように内部的に実装されるかを示しています。これは、「置換」ではなく、ストリーム編集に似ています...


パス名展開bashのパターンマッチングを調査できます

Wordの分割後、-fオプションが設定されていない限り(Set Builtinを参照)、Bashは各Wordで*、?、および[...]の文字をスキャンします。これらの文字のいずれかが表示される場合、Wordはパターン、およびパターンに一致するファイル名のアルファベット順に並べ替えられたリストに置き換えられます。 ...

このようなパス名のパターンでは、*?および[...]以外の文字はそれ自体と一致します。つまり、これはドットが文字通りそれ自体と一致できることを意味します。

ls .*

...は...に展開され(*にはnullも含まれるため)、それに応じて現在のディレクトリと親ディレクトリ、および文字どおりドット(。 *)その後に、長さの異なる何かが続きます。マニュアルで説明されているように、拡張動作などをある程度制御できます(setおよびshoptに* globオプションを使用)。


これは、パターンで使用されている文字の例です(grep pattern fileであるため)1)任意の1文字を選択します。もちろん、ファイル名やディレクトリ名とは関係ありません。

ls -la | grep .

これはディレクトリの内容を出力してすべてをキャッチします(grep -v .空の行 をキャッチするために使用されます)。一般に、そのような式のパターンでは、最も確実に grep の場合がそうであり、単一のドットは任意の単一の文字と一致します。最後に、ドット.セクションのこれらの特殊文字 examples を検討して、さまざまな使用例のいくつかを簡単に思い出させます。


したがって、ドットはパスの解決で使用でき、パターンの一部であるリテラル文字として、式の単一の文字をgrepで置き換えることができ、bashにすることもできます builtin ファイルなどからコマンドを実行するために使用されます。コマンドラインでの使用方法はコンテキストによって異なります...


1.これはもちろん、特定のコマンドの構文に関するものです。コマンドがファイル/パスを引数として受け入れる場合、代わりにドットを使用すると、他の人が示しているように、現在の作業ディレクトリに展開されるので非常に便利です。

6
user44370

.bashrcが変更された場合など、作業ディレクトリ.をソースとして使用することもできます。ターミナルで. .bashrcを使用して、.bashrcを有効にすることができます。 source .bashrcと同じ

4
delta

.を使用して現在のディレクトリを指定するか、..を使用して親ディレクトリを指定する場合、これは通常、シェル自体ではなく、シェル(またはそれが実行するプログラム)。これは、Wordの先頭で使用されるときにシェルによってユーザーのホームディレクトリに展開される~を使用するのとは対照的です。

ここにはいくつかの良い答えがあるので、もちろん、シェル自体によって解釈される一般的なケースは、スクリプトを別のプロセスで実行するのではなく、同じシェルで調達することであると言う以外は、それらをコピーしません。 bashでは、組み込みのsourceが代替ですが、これは他のPOSIXシェルには存在しないため、.を使用する必要があります

自分のものを追加するには、現在のディレクトリで実行するプログラムまたはスクリプトの先頭に./を含める必要があります(現在のディレクトリがPATHにない場合)。例:./myscriptこれが機能するのは、./の存在と同じくらいではないことに注意してください。 /が存在する場合、シェルは(aliasの検索を除く)PATHなどで検索する試みをスキップし、システムに直接渡して実行します。 .の唯一の理由は、フルパスを指定する必要がないようにするためです。

4
Graeme

.は、現在のディレクトリを指定する必要がある場合にも使用されます。たとえば、現在のディレクトリ(およびサブディレクトリ)でファイルを見つけることは、99%の時間でfindを呼び出す方法です。

find . -name '*.pdf'

または:

cp /some/file .

このドットは、1つ上のディレクトリを検索するための二重ドットにすることもできます。

したがって、私が言いたいのは、そのようなディレクトリ、特に現在のディレクトリを指定することは非常に一般的です。

3
orion

。現在の環境でシェルスクリプトを実行してから戻ります(IBMの説明を参照 こちら )。走れば

. ./"yourscripthere"

スクリプトは、新しいシェルを生成するのではなく、実際のシェルで実行されます。このように、スクリプトによって実行された変更(変数、関数など)は、スクリプトを実行した後も継続します。

3
YoMismo

多くの場合、現在のディレクトリに対して相対的な場所を参照する必要があります。

1つ上のディレクトリに移動する場合は、単にcd ..と言います。ファイルを現在のディレクトリにコピーする場合は、cp /some/file .と言います。

場所を指定する必要があるときはいつでも、/で始まる絶対的な場所、または相対的な場所を使用できます。多くのコマンドがデフォルトになっているので、頻繁に現在を指定する必要はありません。 (たとえば、単純なlsのデフォルトは実際にはls .です。)他のコマンド(cpなど)では、パスを明示的に指定する必要があります。この場合、.がまさにあなたの望むものになるかもしれません。

2
michas

また、名前が-で始まるファイルがある場合、オプションとして解釈されるため、ほとんどのコマンドのパラメーターとして使用することはできません。例えば。 stat -xはエラーinvalid optionをスローしますが、stat ./-xは正常に機能します。

2
choroba