Czy mogę utworzyć niestandardowy „alias katalogu”, taki jak „~” w bash?

13

W bash mogę przejść do mojego katalogu domowego za pomocą cd ~i faktycznie odwołać się do mojego katalogu domowego za pomocą dowolnego polecenia za pomocą ~.

Czy mogę utworzyć nowe, niestandardowe „aliasy katalogów” (?) W celu odniesienia do innych katalogów? Hipotetyczny przykład:

make_alias "~~" /mnt/photon/work/foo_project/

cp ~/home.png ~~/set_8/home_4.png

Jak można to zrobić, jeśli tak? Jeśli nie, czy jest to zgodne z projektem i dlaczego?

Miło mieć: gdzie i jak ~jest ustawiony i związany z tym „~”?

n611x007
źródło
1
Nie jest to szczególnie pomocne, ale możesz to zrobić za pomocą globalnych aliasów w .... ZSH, ale nie BASH. : alias -g ~~ = '/ mnt / photon / work / foo_project /'
SuperMagic
1
@SuperMagic: Lubię też globalne aliasy. Ale w drugim przykładzie (cp ~~ / set ...) zawiodą. Nazwane katalogi są bardziej odpowiednie: n=/mnt/photon/work/foo_projecti wtedy cp foo ~n/bar. (Uwaga dla OP: ograniczona również do zsh).
mpy
1
@OliverSalzburg: Nie sądzę, że to duplikat. Drugie pytanie dotyczy remapowania pojedynczych postaci ( @lub _), co nie jest możliwe w bash, podczas gdy na ~~pewno jest (hacky, ale możliwe). Ponadto nie odpowiada, w jaki sposób odbywa się to mapowanie.
Dennis
Powiązane pytanie brzmiało: superuser.com/questions/541767
n611x007

Odpowiedzi:

25

Tylda nie jest aliasem, jest częścią rozszerzenia powłoki bash (podobnie jak *.txtlub $((1 + 2))).

Rozszerzenie tylda Bash obsługuje następujące przedrostki tyldy:

~            The value of $HOME

~/foo        $HOME/foo

~fred/foo    The subdirectory foo of the home directory of the user fred

~+/foo       $PWD/foo

~-/foo       ${OLDPWD-'~-'}/foo

~N           The string that would be displayed by `dirs +N'

~+N          The string that would be displayed by `dirs +N'

~-N          The string that would be displayed by `dirs -N'

dirsużywa stosu katalogów. Możesz użyć, pushdaby dodać do niego katalog.

Aby odpowiedzieć na konkretne pytanie dotyczące ~~, tak, można zmapować do niego katalog. Wystarczy utworzyć użytkownika o nazwie ~i ustawić /mnt/photon/work/foo_project/jako jego katalog domowy:

sudo useradd '~'
sudo sed -i 's#:/home/~:[^:]*$#:/mnt/photon/work/foo_project:/bin/false#' /etc/passwd

Oczywiście dużo bardziej „rozsądnym” podejściem jest po prostu definiowanie zmiennej powłoki, która wskazuje na twój katalog w twoim ~/.bashrcpoleceniu

foo=/mnt/photon/work/foo_project

do którego można uzyskać $foojak zwykle dostęp.

Dennis
źródło