Utwórz kolejny skrót `~~` jak `~` (katalog domowy)

10

Chcę ~~wskazać inny katalog, aby można go było używać jako skrótu. Chcę, żeby miał dokładnie takie same funkcje jak ~. W jaki sposób mogę to zrobić?

VarunAgw
źródło
2
Lepiej może być z nazwanymi katalogami zsh
Michael Mrozek
Właśnie znalazłem ciekawe rozwiązanie problemu superuser.com/a/565825/398328
VarunAgw
1
@ VarunAgw haha, zabawne znalezisko, tak jak myślałem o tym samym rozwiązaniu. Wstyd. Przez chwilę myślałem, że jestem wyjątkowym motylem :(
Gravy

Odpowiedzi:

14

Właściwie jest sposób, to nie jest świetny sposób, ale jest sposób, haha!

Dodaj następujące elementy do /etc/passwdpliku:

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

zamień 1111jako UID na coś, co ma sens, zamień /testna katalog, który chcesz ~~ naśladować.

99w moim systemie jest nobodygrupa, którą polecam, jeśli zrobisz to, aby upewnić się, że jest to grupa BEZ uprawnień dla dowolnego pliku, który kiedykolwiek zostanie wykorzystany. Teoretycznie /sbin/nologinjako powłoka nie powinna być używana, nie będzie też miała /etc/shadowpozycji, więc nie będzie miała hasła. Teoretycznie powinno być w porządku, ale upewnij się, że nie pozwoli ci to zalogować się jako konto.

Na marginesie: Nie mówię w żaden sposób, że jest to dobry pomysł, ale osiągnie pożądaną funkcjonalność.

EDYCJA: Dla kompletności zostało to zasugerowane przez VarunAgw: Możesz dodać użytkownika jak zwykle za pomocą, useradd -s /sbin/nologin -N tmpa następnie zmodyfikować /etc/passwdi /etc/shadowzmienić użytkownika tmpna ~i zmienić lokalizacjęhome directory

Sos
źródło
Zamiast zmieniać UID i GID, możemy po prostu useradd 'tmp', a następnie zastąpić tmpz~
VarunAgw
Prawdziwe. dobry pomysł. Nie jestem pewien, co sądzę o legitymizacji go shadowwpisem, ale przypuszczam, że dopóki hasło nie zostanie ustawione, nie stanowi to dodatkowego ryzyka.
Sos
8

Możesz skorzystać z CDPATH i umieścić katalog dosłownie ~~ w jednym ze składników CDPATH.

Od man bash(ale CDPATH jest dostępny nawet w sh)

Ścieżka wyszukiwania dla polecenia cd. Jest to rozdzielona dwukropkami lista katalogów, w których powłoka szuka katalogów docelowych określonych przez polecenie cd. Przykładowa wartość to „.: ~: / Usr”.

To pozwoli ci to zrobić cd ~~.

Jeśli chcesz robić rzeczy vi ~~/someFilez dowolnego miejsca w drzewie katalogów, nie masz szczęścia, jeśli nalegasz ~~dosłownie, chyba że włamiesz się do powłoki, jednak możesz użyć zmiennych lub zmiennej środowiskowej do przechowywania swoich magicznych katalogów, abyś mógł to zrobić np.$tilda/someFile

Zwykle umieszczam często używane pliki w katalogach o krótkich nazwach w moim katalogu domowym, aby uzyskać do nich dostęp za pomocą ścieżek takich jak ~/blub ~/l.

Naturalnie, zwykle możesz zastąpić katalogi dowiązaniami symbolicznymi do katalogów, ile chcesz.

PSkocik
źródło
1

Rozszerzanie ~tyldy powłoki jest w większości programowalne. Rozwija się albo do katalogu użytkownika systemowej nazwy użytkownika zadeklarowanego w końcowym kontekście (i już zaproponowano doskonałe rozwiązanie w tym zakresie) , wartości $HOMEzmiennej powłoki, albo wcale.

Więc:

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

/tmp
/home/mikeserv

$HOMECały czas się zmieniam i zachowuję funkcję w pliku środowiska mojej powłoki do resetowania:

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

Jeśli chcesz użyć ~tyldy w sposób, który nie odnosi się do twojego katalogu domowego, zrób to . Po prostu ponownie przypisz $HOME. Nie bój się tego. $HOMEjest po prostu zmienną powłoki jak każda inna.


Inną sugestią, którą mam, jest tylko niewielkie rozwinięcie doskonałej porady @ PSkocik na temat używania $CDPATH. Jedną rzeczą, o której nie wspomniał, jest to, że możesz używać i modyfikować $CDPATHwbudowane bez zmiany bieżącej wartości powłoki $CDPATH. Na przykład:

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

/tmp/1/2

cdjest koniecznie wbudowaną powłoką, ale nie jest specjalną wbudowaną powłoką POSIX , więc zadeklarowanie wartości dla $CDPATHnie wpływa na jego bieżącą wartość. Jeśli użyjesz go tak jak ja, powyższa $CDPATHwartość zostanie zmieniona tylko dla środowiska jednego cdpolecenia, a następnie zostanie przywrócona do poprzedniej wartości. Wydaje mi się, że powyższa technika jest najbardziej użyteczna w połączeniu z uzupełnianiem historii. Zrobię powyższą rzecz, przejdę do katalogu, uruchomię kilka poleceń, a następnie naciskam w górę, aż wrócę do cdpolecenia i cofam się o segment lub dwa ścieżki, aby przejść w inne miejsce.


Teraz, jeśli połączysz te dwie koncepcje, możesz sprawić, by poprzednio używane polecenie oznaczało coś zupełnie innego przy następnym użyciu.

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

/tmp/1/2
/home/mikeserv/1/2
mikeserv
źródło
0

Działa doskonale jako funkcja bash:

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

Oto inne podejście, które jest trochę bliżej (wiem, że nie zbliżam się tak bardzo do wymagań)

function ~~ { echo /test; }

Następnie z kilkoma kolejnymi postaciami:

cd `~~`/subdir
vi `~~`/file
Glenn Jackman
źródło
2
Cóż, cd ~~/foo/barnie zadziała tak dobrze, ani vim ~~/foo.txt, itd.
derobert
1
Pytanie jest niejasne. Jeśli jest to pożądane użycie, użyłbym CDPATHzmiennej do obsługi cdsprawy.
glenn jackman
Zgadzam się, że nie jest w pełni jasne, ale OP prosi, aby działało jak ~. I ~nie jest używany jak polecenie.
derobert
Uznałem to za całkiem zrozumiałe, jeśli nie całkowicie określone. Problem CDPATHpolega na tym, że nie działa dla poleceń spoza ... CD. IE mogłeś cd ~~albo cd ~~/testdir1ale nie możnavim ~~testdir1
Gravy
możesz lepiej zrobić z aliasem, który wywołuje funkcję. jakalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv