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