Créez un autre raccourci `~~` comme `~` (répertoire personnel)

10

Je veux ~~pointer vers un répertoire différent afin de pouvoir l'utiliser comme raccourci. Je veux qu'il ait exactement les mêmes fonctionnalités que ~. Comment puis-je faire ceci?

VarunAgw
la source
2
Vous pourriez être mieux avec les répertoires nommés zsh
Michael Mrozek
Je viens de trouver une solution intéressante au problème superuser.com/a/565825/398328
VarunAgw
1
@VarunAgw haha, drôle de trouvaille, juste comme j'avais pensé à la même solution. La honte. Je pensais que j'étais un papillon unique pendant une minute :(
Gravy

Réponses:

14

En fait, il y a un moyen, ce n'est pas un excellent moyen, mais c'est un moyen, haha!

Ajoutez les éléments suivants à votre /etc/passwdfichier:

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

remplacez le 1111comme UID par quelque chose qui a du sens, remplacez-le /testpar le répertoire que vous souhaitez ~~ imiter.

99sur mon système est le nobodygroupe que je recommande si vous le faites pour vous assurer qu'il s'agit d'un groupe sans autorisations sur aucun fichier qui sera utilisé. Théoriquement avec /sbin/nologincomme shell, il ne devrait pas pouvoir être utilisé, il n'aura pas non plus d' /etc/shadowentrée donc il n'aura pas de mot de passe. Théoriquement, ça devrait aller, mais assurez-vous que cela ne vous permet pas de vous connecter en tant que compte.

En remarque: je ne dis en aucune façon que c'est une bonne idée, mais cela accomplira les fonctionnalités que vous souhaitez.

EDIT: Pour être complet cela a été suggéré par VarunAgw: Vous pouvez ajouter l'utilisateur comme d' habitude avec useradd -s /sbin/nologin -N tmpet ensuite modifier /etc/passwdet /etc/shadowde changer l'utilisateur tmpde ~changer l'emplacement duhome directory

Sauce
la source
Au lieu de changer l'UID et le GID, nous pouvons simplement useradd 'tmp'et ensuite remplacer tmppar~
VarunAgw
Vrai. bonne suggestion. Je ne sais pas ce que je pense de le légitimer avec une shadowentrée, mais je suppose que tant qu'aucun mot de passe n'est défini, ce n'est pas vraiment un risque supplémentaire.
Gravy
8

Vous pouvez utiliser CDPATH et placer un répertoire nommé littéralement ~~ dans l'un de vos composants CDPATH.

De man bash(mais CDPATH est disponible même en sh)

Chemin de recherche de la commande cd. Il s'agit d'une liste de répertoires séparés par deux points dans laquelle le shell recherche les répertoires de destination spécifiés par la commande cd. Un exemple de valeur est ".: ~: / Usr".

Cela vous permettra de le faire cd ~~.

Si vous voulez faire des choses comme vi ~~/someFilen'importe où dans l'arborescence des répertoires, alors vous n'avez pas de chance si vous insistez ~~littéralement, sauf si vous piratez votre shell, cependant, vous pouvez utiliser des variables ou une variable d'environnement pour stocker vos répertoires magiques afin que vous puissiez faire , par exemple,$tilda/someFile

Je place généralement des fichiers souvent consultés dans des répertoires brièvement nommés dans mon répertoire personnel afin que je puisse y accéder avec des chemins tels que ~/bou ~/l.

Naturellement, vous pouvez généralement remplacer les répertoires par des liens symboliques vers les répertoires autant que vous le souhaitez.

PSkocik
la source
1

L' ~expansion tilde du shell est principalement programmable. Il se développe soit vers le répertoire utilisateur du nom d'utilisateur du système déclaré dans son contexte de fin (et une excellente solution dans ce sens a déjà été proposée) , soit la valeur de la $HOMEvariable shell, ou pas du tout.

Donc:

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

/tmp
/home/mikeserv

Je change $HOMEtout le temps, et je garde une fonction dans le fichier d'environnement de mon shell pour le réinitialiser:

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

Si vous souhaitez utiliser le ~tilde d'une manière qui ne fait pas référence à votre répertoire personnel, faites-le . Réattribuez simplement $HOME. N'ayez pas peur de ça. $HOMEest juste une variable shell comme les autres.


Une autre suggestion que j'ai n'est qu'une légère extension des excellents conseils de @ PSkocik sur l'utilisation $CDPATH. Une chose qu'il n'a pas mentionnée, cependant, est que vous pouvez utiliser et modifier en $CDPATHligne sans modifier la valeur actuelle du shell pour $CDPATH. Par exemple:

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

/tmp/1/2

cdest nécessairement un shell intégré, mais ce n'est pas un shell spécial POSIX , et donc déclarer la valeur pour $CDPATHn'affecte pas sa valeur shell actuelle. Si vous l'utilisez comme je l'ai fait ci-dessus, $CDPATHla valeur n'est modifiée que pour l'environnement de la seule cdcommande et est ensuite restaurée à sa valeur précédente. J'ai tendance à trouver la technique ci-dessus la plus utile lorsqu'elle est utilisée en combinaison avec l'achèvement de l'historique. Je vais faire la chose ci-dessus, passer à un répertoire, exécuter quelques commandes, puis appuyer jusqu'à ce que je revienne à ma cdcommande et revenir en arrière sur un segment de chemin ou deux pour aller ailleurs.


Maintenant, si vous combinez ces deux concepts, vous pouvez faire en sorte qu'une commande précédemment utilisée signifie quelque chose de complètement différent la prochaine fois que vous l'utiliserez.

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

/tmp/1/2
/home/mikeserv/1/2
mikeserv
la source
0

Fonctionne parfaitement bien comme fonction bash:

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

Voici une autre approche qui se rapproche un peu (je sais que je ne me rapproche pas autant des exigences)

function ~~ { echo /test; }

Puis avec quelques autres personnages:

cd `~~`/subdir
vi `~~`/file
glenn jackman
la source
2
Eh bien, cd ~~/foo/barça ne va pas si bien fonctionner, ou vim ~~/foo.txt, etc ...
derobert
1
La question n'est pas claire. Si c'est l'utilisation souhaitée, j'utiliserais la CDPATHvariable pour gérer le cdcas.
glenn jackman
D'accord, ce n'est pas tout à fait clair, mais OP demande qu'il fonctionne comme ~. Et ~n'est pas utilisé comme une commande.
derobert
Je l'ai trouvé assez compréhensible moi-même, sinon complètement expliqué. Le problème CDPATHest que cela ne fonctionne pas pour les commandes en dehors de .... CD. IE vous pourriez cd ~~ou cd ~~/testdir1vous ne pourriez pasvim ~~testdir1
Gravy
vous pourriez faire mieux avec un alias qui appelle une fonction. commealias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv