GNU/Linux >> Linux Esercitazione >  >> Linux

Zsh/bash:espandere i percorsi relativi negli argomenti dei comandi utilizzando le regole della struttura della directory logica prima dell'esecuzione?

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


Linux
  1. Passare gli argomenti della riga di comando allo script Bash?

  2. Usando –exclude con il comando Du?

  3. Utilizzo del comando Linux Basename negli script Bash

  4. Dividi l'output del comando per colonne usando Bash?

  5. Conserva le virgolette negli argomenti di bash

Come visualizzare la struttura ad albero delle directory in Linux

Come passare automaticamente a una directory senza utilizzare il comando Cd in Linux

Diversi modi per elencare i contenuti della directory senza utilizzare il comando ls

Bash Scripting – Analizza gli argomenti negli script Bash usando getopts

Come stampare la directory di lavoro usando il comando pwd di Linux?

Utilizzo del comando Linux Dirname negli script Bash