GNU/Linux >> Znalost Linux >  >> Linux

Zsh/bash:Rozbalte relativní cesty v argumentech příkazů pomocí pravidel struktury logického adresáře před spuštěním?

Takže vím, že pwd a cd v shellu mají „logický“ a „fyzický“ režim (viz tato otázka SO a otázky odtud odkazované).

Nyní předpokládejme, že mám tento symbolický odkaz:

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

Chcete-li sledovat lokálně, postupujte takto:

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

Nyní, když začnu ve svém $HOME a cd do foo , dostanu „logickou“ cestu (s výchozím nastavením) pomocí pwd a může získat „fyzickou“ cestu pomocí -P :

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

Samozřejmě „.. “ vždy odkazuje na rodiče „fyzické“ cesty (rozumím tomu, že to není ani interpretováno shellem, pouze předáno příkazu tak, jak je, a některé speciální vestavěné příkazy jako cd interpretujte jej speciálně, abyste získali „logické“ chování):

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

Chci, když jsem v $HOME/foo (nebo kterýkoli z jeho podadresářů), které používám jakékoli relativní cesty (např. ls -l ../.. ).

Například:

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

Chci to vyřešit na vi /home/<username>/something.txt .

Existuje něco jednoduššího/kratšího než udělat následující (nebo napsat funkci shellu, kterou mohu předřadit svému příkazu, která projde všemi argumenty a – pokud odkazují na cesty – rozšíří je, než je předám příkazu)?

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

Existuje něco jako „rozšíření logické cesty pro parametry příkazového řádku, které jsou relativními cestami k souboru, které se provádí předtím, než shell provede příkaz“? Používám zsh , ale jakákoli řešení pro bash nebo zsh bylo by to v pořádku.

Přijatá odpověď:

Na to odpovím pro Zsh, protože to je to, co používám.

Chcete-li dosáhnout požadovaného efektu pomocí .. při použití cd , jednoduše přidejte následující do svého ~/.zshrc soubor:

setopt NO_chase_dots NO_chase_links

Dokumentace zde:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS

Ve všech ostatních případech místo .. , budete muset použít :h (“hlava”) modifikátor rozšíření:

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

Pokud potřebujete dosáhnout více než jedné úrovně, můžete k ní připojit číslo (za předpokladu, že výraz obklopíte složenými závorkami) nebo stačí opakovat :h :

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

Dokumentace zde:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers


Linux
  1. Proč je nastavení proměnné před příkazem v Bash legální?

  2. Použití příkazu Linux Basename ve skriptech Bash

  3. Rozdělit výstup příkazu podle sloupců pomocí Bash?

  1. Předat argumenty příkazového řádku skriptu Bash?

  2. Použití –exclude With The Du Command?

  3. Nastavte relativní čas pomocí příkazového řádku

  1. Použití Linux Sleep Command ve skriptech Bash

  2. Zachovat uvozovky v argumentech bash

  3. argumenty příkazového řádku pro spuštění dockeru