Voglio ~~
indicare una directory diversa in modo da poterla utilizzare come scorciatoia. Voglio che abbia esattamente le stesse funzionalità di ~
. Come posso fare questo?
Voglio ~~
indicare una directory diversa in modo da poterla utilizzare come scorciatoia. Voglio che abbia esattamente le stesse funzionalità di ~
. Come posso fare questo?
Risposte:
In realtà, c'è un modo, non è un ottimo modo, ma è un modo, ahah!
Aggiungi quanto segue al tuo /etc/passwd
file:
~:x:1111:99:special Character user:/test:/sbin/nologin
sostituisci 1111
come UID con qualcosa che abbia senso, sostituiscilo /test
con la directory che vuoi che ~~ imiti.
99
sul mio sistema è il nobody
gruppo che consiglio se lo fai per assicurarti che sia un gruppo senza autorizzazioni per qualsiasi file che verrà mai utilizzato. Teoricamente con /sbin/nologin
come shell, non dovrebbe essere in grado di essere utilizzato, inoltre non avrà una /etc/shadow
voce, 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 tmp
e quindi modificare /etc/passwd
e /etc/shadow
cambiare l'utente tmp
per ~
e cambiare la posizione delhome directory
useradd 'tmp'
e poi sostituire tmp
con~
shadow
voce, ma suppongo che fino a quando non viene impostata una password non sia un rischio aggiuntivo.
È 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 ~~/someFile
da 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 ~/b
o ~/l
.
Naturalmente, di solito è possibile sostituire le directory con collegamenti simbolici alle directory tutte le volte che lo si desidera.
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 $HOME
variabile shell, o per niente.
Così:
(HOME=/tmp; cd ~)
pwd; echo "$HOME"
/tmp
/home/mikeserv
Cambio $HOME
tutto 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 $CDPATH
linea 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 $CDPATH
non 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 cd
comando 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 cd
comando 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
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
cd ~~/foo/bar
non funzionerà così bene, o vim ~~/foo.txt
, ecc ...
CDPATH
variabile per gestire il cd
caso.
~
. E ~
non è usato come un comando.
CDPATH
è che non funziona per i comandi al di fuori di .... CD. Vale a dire che potresti cd ~~
o cd ~~/testdir1
non potrestivim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '