Crea un altro collegamento `~~` like `~` (home directory)


10

Voglio ~~indicare una directory diversa in modo da poterla utilizzare come scorciatoia. Voglio che abbia esattamente le stesse funzionalità di ~. Come posso fare questo?


2
Potresti stare meglio con le directory
Michael Mrozek

Ho appena trovato una soluzione interessante al problema superuser.com/a/565825/398328
VarunAgw

1
@VarunAgw haha, Funny find, proprio come avevo pensato alla stessa soluzione. Vergogna. Ho pensato di essere una farfalla unica per un minuto :(
Gravy

Risposte:


14

In realtà, c'è un modo, non è un ottimo modo, ma è un modo, ahah!

Aggiungi quanto segue al tuo /etc/passwdfile:

~:x:1111:99:special Character user:/test:/sbin/nologin

sostituisci 1111come UID con qualcosa che abbia senso, sostituiscilo /testcon la directory che vuoi che ~~ imiti.

99sul mio sistema è il nobodygruppo che consiglio se lo fai per assicurarti che sia un gruppo senza autorizzazioni per qualsiasi file che verrà mai utilizzato. Teoricamente con /sbin/nologincome shell, non dovrebbe essere in grado di essere utilizzato, inoltre non avrà una /etc/shadowvoce, quindi non avrà una password. Teoricamente dovrebbe andare bene, ma assicurati che non ti permetta in qualche modo di accedere come account.

Come nota a margine: non sto in alcun modo dicendo che questa è una buona idea, ma realizzerà la funzionalità che desideri.

EDIT: Per completezza questo è stato suggerito da VarunAgw: Si potrebbe aggiungere l'utente come normale con useradd -s /sbin/nologin -N tmpe quindi modificare /etc/passwde /etc/shadowcambiare l'utente tmpper ~e cambiare la posizione delhome directory


Invece di cambiare UID e GID, possiamo semplicemente useradd 'tmp'e poi sostituire tmpcon~
VarunAgw

Vero. buon consiglio. Non sono sicuro di come mi sento di legittimarlo con una shadowvoce, ma suppongo che fino a quando non viene impostata una password non sia un rischio aggiuntivo.
Sugo

8

È possibile utilizzare CDPATH e inserire una directory letteralmente denominata ~~ in uno dei componenti CDPATH.

Da man bash(ma CDPATH è disponibile anche in sh)

Il percorso di ricerca per il comando cd. Questo è un elenco separato da due punti di directory in cui la shell cerca le directory di destinazione specificate dal comando cd. Un valore di esempio è ".: ~: / Usr".

Questo ti permetterà di farlo cd ~~.

Se vuoi fare cose come vi ~~/someFileda qualsiasi parte dell'albero della directory, allora sei sfortunato se insisti ~~letteralmente a meno che tu non modifichi la tua shell, tuttavia, puoi usare variabili o variabili d'ambiente per memorizzare le tue directory magiche in modo da poter fare , per esempio,$tilda/someFile

Di solito inserisco i file a cui si accede spesso all'interno di directory con nome breve nella mia directory home in modo da poter accedervi con percorsi come ~/bo ~/l.

Naturalmente, di solito è possibile sostituire le directory con collegamenti simbolici alle directory tutte le volte che lo si desidera.


1

L' ~espansione della tilde della shell è principalmente programmabile. Si espande nella directory utente del nome utente di sistema dichiarata nel suo contesto finale (ed è già stata offerta una soluzione eccellente in tal senso) , il valore della $HOMEvariabile shell, o per niente.

Così:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

Cambio $HOMEtutto il tempo e mantengo una funzione nel file di ambiente della mia shell per ripristinarla:

home(){
    HOME=~$USER
    cd ~; pwd
}

Se vuoi usare la ~tilde in un modo che non si riferisce alla tua home directory, allora fallo . Riassegna $HOME. Non averne paura. $HOMEè solo una variabile di shell come qualsiasi altra.


Un altro suggerimento che ho è solo una leggera espansione dell'eccellente consiglio di @ PSkocik sull'uso $CDPATH. Una cosa che non ha menzionato, tuttavia, è che puoi usare e modificare in $CDPATHlinea senza cambiare il valore della shell corrente $CDPATH. Per esempio:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdè necessariamente un built-in di shell, ma non è un built-in di shell POSIX speciale , e quindi dichiarare il valore per $CDPATHnon influisce sul suo valore di shell corrente. Se lo usi come ho fatto sopra $CDPATH, il valore viene modificato solo per l'ambiente di un cdcomando e viene ripristinato al valore precedente in seguito. Tendo a trovare la tecnica di cui sopra più utile quando utilizzata in combinazione con il completamento della storia. Farò la cosa sopra, cambierò in una directory, eseguirò alcuni comandi, quindi premerò fino a quando non torno al mio cdcomando e indietro di uno o due segmenti di percorso per spostarmi altrove.


Ora se combini questi due concetti, puoi fare in modo che un comando usato in precedenza significhi qualcosa di completamente diverso la prossima volta che lo usi.

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

Funziona perfettamente come funzione bash:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

Ecco un altro approccio che si avvicina un po '(so che non mi sto avvicinando così tanto ai requisiti)

function ~~ { echo /test; }

Quindi con un altro paio di personaggi:

cd `~~`/subdir
vi `~~`/file

2
Bene, cd ~~/foo/barnon funzionerà così bene, o vim ~~/foo.txt, ecc ...
Derobert,

1
La domanda non è chiara. Se è l'uso desiderato, utilizzerei la CDPATHvariabile per gestire il cdcaso.
Glenn Jackman,

D'accordo, non è del tutto chiaro, ma OP chiede che funzioni come ~. E ~non è usato come un comando.
derobert,

L'ho trovato abbastanza comprensibile da solo, se non completamente spiegato. Il problema CDPATHè che non funziona per i comandi al di fuori di .... CD. Vale a dire che potresti cd ~~o cd ~~/testdir1non potrestivim ~~testdir1
Gravy

potresti fare meglio con un alias che chiama una funzione. comealias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.