GNU/Linux >> Linux の 問題 >  >> Linux

Zsh / bash:実行前に論理ディレクトリ構造ルールを使用してコマンド引数の相対パスを展開しますか?

だから私はpwd およびcd シェルには「論理」モードと「物理」モードがあります(このSOの質問とそこからリンクされている質問を参照してください)。

さて、私がこのシンボリックリンクを持っていると仮定します:

/home/<username>/foo -> /tmp/bar

ローカルでフォローするには、次のようにします。

mkdir /tmp/bar
ln -s /tmp/bar ~/foo

さて、 $ HOMEから始めると およびcd fooに 、 pwd で「論理」パス(デフォルト設定)を取得します 、および -Pを使用して「物理」パスを取得できます :

$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar

もちろん、「 .. 」は常に「物理」パスの親を指します(私の理解では、シェルによっても解釈されず、そのままコマンドに渡され、 cd> 「論理的な」振る舞いを得るために特別に解釈します):

$ pwd
/home/<username>/foo
$ realpath ..
/tmp

私が欲しいのは、 $ HOME / fooにいるときです。 (またはそのサブディレクトリのいずれか)私が使用する相対パス(例: ls -l ../.. )「論理」パスに関連して解釈/拡張されます(コマンドの前に何かを付ける必要がある場合は問題ありません)。

例:

$ pwd
/home/<username>/foo
$ vi ../something.txt

これをvi/home//something.txtに解決したい 。

次のことを行うよりも簡単/短いものはありますか(または、すべての引数を調べ、パスを参照している場合は、コマンドに渡す前に展開するシェル関数を作成して、コマンドの前に付けることができます)?

$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)

「シェルがコマンドを実行する前に実行される相対ファイルパスであるコマンドラインパラメーターの論理パス拡張」のようなものはありますか? zshを使用しています 、ただし、 bashのソリューション またはzsh 大丈夫でしょう。

承認された回答:

私が使用しているのはZshなので、これに答えます。

..で必要な効果を得るには cdを使用する場合 、〜/ .zshrcに以下を追加するだけです ファイル:

setopt NO_chase_dots NO_chase_links

ここのドキュメント:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS

他のすべての場合、 ..の代わりに 、:hを使用する必要があります (「頭」)拡張修飾子:

$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt

複数のレベルに到達する必要がある場合は、それに番号を追加するか(式を中括弧で囲む場合)、:hを繰り返すことができます。 :

# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo

ここのドキュメント:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers


Linux
  1. Bashで合法的なコマンドの前に変数を設定するのはなぜですか?

  2. Duコマンドで–excludeを使用しますか?

  3. BashスクリプトでのLinuxスリープコマンドの使用

  1. BashスクリプトでのLinuxBasenameコマンドの使用

  2. コマンドの出力をBashを使用して列ごとに分割しますか?

  3. コマンドラインを使用して相対時間を設定する

  1. コマンドライン引数をBashスクリプトに渡しますか?

  2. bash 引数で引用符を保持する

  3. docker run へのコマンドライン引数