Quindi so che pwd
e cd
nella shell hanno una modalità "logica" e "fisica" (vedi questa domanda SO e le domande collegate da lì).
Ora, supponiamo che io abbia questo collegamento simbolico:
/home/<username>/foo -> /tmp/bar
Per seguire localmente, basta fare questo:
mkdir /tmp/bar
ln -s /tmp/bar ~/foo
Ora, quando inizio nel mio $HOME
e cd
in foo
, ottengo il percorso "logico" (con le impostazioni predefinite) con pwd
e può ottenere il percorso "fisico" con -P
:
$ cd ~/foo
$ pwd
/home/<username>/foo
$ pwd -P
/tmp/bar
Naturalmente, "..
" si riferisce sempre al genitore del percorso "fisico" (la mia comprensione è che non è nemmeno interpretato dalla shell, solo passato al comando così com'è e alcuni comandi speciali integrati come cd
interpretarlo in modo speciale per ottenere il comportamento "logico"):
$ pwd
/home/<username>/foo
$ realpath ..
/tmp
Quello che voglio è quando sono in $HOME/foo
(o una delle sue sottodirectory) che qualsiasi percorso relativo che utilizzo (ad es. ls -l ../..
) da interpretare/ampliare rispetto al percorso “logico” (va bene se devo anteporre qualcosa al mio comando).
Ad esempio:
$ pwd
/home/<username>/foo
$ vi ../something.txt
Voglio che questo si risolva in vi /home/<username>/something.txt
.
C'è qualcosa di più facile/più breve che fare quanto segue (o scrivere una funzione di shell con cui posso anteporre il mio comando che va su tutti gli argomenti e, se si riferiscono a percorsi, li espandi prima di passarli al comando)?
$ pwd
/home/<username>/foo
$ realpath -L $PWD/../something.txt
/home/<username>/something.txt
$ vi $(realpath -L $PWD/../something.txt)
Esiste qualcosa come "un'espansione del percorso logico per i parametri della riga di comando che sono percorsi di file relativi eseguiti prima che la shell esegua il comando"? Sto usando zsh
, ma tutte le soluzioni per bash
o zsh
andrebbe bene.
Risposta accettata:
Risponderò a questo per Zsh, poiché è quello che sto usando.
Per ottenere l'effetto che desideri con ..
quando si utilizza cd
, aggiungi semplicemente quanto segue al tuo ~/.zshrc
file:
setopt NO_chase_dots NO_chase_links
Documentazione qui:http://zsh.sourceforge.net/Doc/Release/Options.html#index-CHASEDOTS
Per tutti gli altri casi, invece di ..
, dovrai usare il :h
modificatore di espansione ("testa"):
$ pwd
/home/<username>/foo
$ vi $PWD:h/something.txt
Se devi raggiungere più di un livello, puoi aggiungervi un numero (a patto di racchiudere l'espressione tra parentesi graffe) o semplicemente ripetere il :h
:
# These two are equivalent:
$ vi ${PWD:h2}/foo
$ vi $PWD:h:h/foo
Documentazione qui:http://zsh.sourceforge.net/Doc/Release/Expansion.html#Modifiers