Crie outro atalho `~~` como `~` (diretório inicial)

10

Quero ~~apontar para um diretório diferente para que eu possa usá-lo como um atalho. Eu quero que ele tenha exatamente as mesmas funcionalidades que ~. Como posso fazer isso?

VarunAgw
fonte
2
Você pode estar melhor com os diretórios zsh nomeados
Michael Mrozek
Acabei de encontrar uma solução interessante para o problema superuser.com/a/565825/398328
VarunAgw 29/09/2015
1
@ VarunAgw haha, achado engraçado, exatamente como eu pensava na mesma solução. Vergonha. Eu pensei que eu era uma borboleta única por um minuto :(
Molho

Respostas:

14

Na verdade, existe uma maneira, não é uma ótima maneira, mas é uma maneira, haha!

Adicione o seguinte ao seu /etc/passwdarquivo:

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

substitua o 1111como o UID por algo que faça sentido, substitua /testpelo diretório que você deseja imitar.

99no meu sistema é o nobodygrupo que eu recomendo, se você fizer isso para garantir que seja um grupo sem permissões em qualquer arquivo que será usado. Teoricamente, /sbin/nologincomo o shell, ele não deve poder ser usado, também não terá uma /etc/shadowentrada, portanto não terá uma senha. Teoricamente, tudo bem, mas certifique-se de que isso não permita que você faça login como a conta.

Como uma observação lateral: não estou dizendo de forma alguma que essa é uma boa idéia, mas ela alcançará a funcionalidade que você deseja.

EDIT: Para completar amor este foi sugerido por VarunAgw: Você pode adicionar o usuário como normal com useradd -s /sbin/nologin -N tmpe, em seguida, modificar /etc/passwde /etc/shadowmudar o usuário tmppara ~e alterar o local dohome directory

Molho
fonte
Em vez de mudar UID e GID, podemos apenas useradd 'tmp'e, em seguida, substituir tmpcom~
VarunAgw
Verdadeiro. boa sugestão. Não tenho certeza de como me sinto em legitimá-lo com uma shadowentrada, mas suponho que, desde que nenhuma senha seja definida, não é realmente um risco adicional.
Molho
8

Você pode usar o CDPATH e colocar um diretório literalmente nomeado ~~ em um dos seus componentes do CDPATH.

De man bash(mas o CDPATH está disponível mesmo em sh)

O caminho de pesquisa para o comando cd. Esta é uma lista de diretórios separados por dois pontos, em que o shell procura os diretórios de destino especificados pelo comando cd. Um valor de amostra é ".: ~: / Usr".

Isso permitirá que você faça cd ~~.

Se você quiser fazer coisas como vi ~~/someFileem qualquer lugar da árvore de diretórios, não terá sorte se insistir ~~literalmente, a menos que invadir seu shell, no entanto, você pode usar variáveis ​​ou variáveis ​​de ambiente para armazenar seus diretórios mágicos, para que você possa fazer isso. , por exemplo,$tilda/someFile

Normalmente, coloco arquivos acessados ​​frequentemente em diretórios nomeados em breve no meu diretório pessoal, para que eu possa acessá-los com caminhos como ~/bou ~/l.

Naturalmente, você geralmente pode substituir diretórios por links simbólicos para diretórios o quanto quiser.

PSkocik
fonte
1

A ~expansão de til do shell é principalmente programável. Ele se expande para o diretório do usuário do nome de usuário do sistema declarado em seu contexto final (e uma excelente solução nesse sentido já foi oferecida) , o valor da $HOMEvariável do shell ou não é o caso.

Assim:

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

/tmp
/home/mikeserv

Eu mudo $HOMEo tempo todo e mantenho uma função no arquivo de ambiente do meu shell para redefini-lo:

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

Se você quiser usar o ~til de alguma forma que não se refira ao seu diretório pessoal, faça-o . Apenas reatribua $HOME. Não tenha medo disso. $HOMEé apenas uma variável de shell como qualquer outra.


Outra sugestão que tenho é apenas uma pequena expansão dos excelentes conselhos do @ PSkocik sobre o uso $CDPATH. Uma coisa que ele não mencionou, porém, é que você pode usar e alterar $CDPATHinline sem alterar o valor atual do shell $CDPATH. Por exemplo:

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

/tmp/1/2

cdé necessariamente um builtin shell, mas não é um POSIX especial builtin shell, e assim declarar o valor para $CDPATHnão afeta seu valor shell atual. Se você usá-lo como eu fiz acima $CDPATH, o valor de apenas será alterado para o ambiente do cdcomando one e será restaurado ao seu valor anterior posteriormente. Costumo achar a técnica acima mais útil quando usada em combinação com a conclusão do histórico. Farei o que foi dito acima, mudarei para um diretório, executarei alguns comandos e pressione até voltar ao meu cdcomando e retroceder um segmento de caminho ou dois para mover para outro lugar.


Agora, se você combinar esses dois conceitos, poderá fazer com que um comando usado anteriormente signifique algo completamente diferente na próxima vez que você o usar.

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

/tmp/1/2
/home/mikeserv/1/2
mikeserv
fonte
0

Funciona perfeitamente bem como uma função bash:

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

Aqui está outra abordagem que se aproxima um pouco (sei que não estou chegando tão perto dos requisitos)

function ~~ { echo /test; }

Depois, com mais alguns personagens:

cd `~~`/subdir
vi `~~`/file
Glenn Jackman
fonte
2
Bem, cd ~~/foo/barnão vai funcionar tão bem, ou vim ~~/foo.txtetc ...
derobert
1
A questão não é clara. Se esse for o uso desejado, eu usaria a CDPATHvariável para lidar com o cdcaso.
Glenn Jackman
Concordo que não está totalmente claro, mas o OP pede que funcione como ele ~. E ~não é usado como um comando.
derobert 29/09
Eu próprio achei bastante compreensível, se não completamente enunciado. O problema CDPATHé que ele não funciona para comandos fora do .... CD. cd ~~Ou seja, você poderia ou cd ~~/testdir1não, você não poderiavim ~~testdir1
Gravy
você pode fazer melhor com um alias que chama uma função. Comoalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv 29/09/2015