创建另一个快捷方式“ ~~”,例如“〜”(主目录)


10

我想~~指向另一个目录,以便可以将其用作快捷方式。我希望它具有与完全相同的功能~。我怎样才能做到这一点?


2
你可能会用更好的zsh命名的目录
迈克尔Mrozek

刚刚找到了一个有趣的问题解决方案superuser.com/a/565825/398328
VarunAgw 2015年

1
@VarunAgw哈哈,有趣的发现,就像我想到的一样。耻辱。我以为一分钟我是一只独特的蝴蝶:(
Gravy

Answers:


14

其实有办法,不是好办法,但是有办法,哈哈!

将以下内容添加到您的/etc/passwd文件中:

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

1111UID 替换为有意义的内容,并替换/test为您想要~~模仿的目录。

99我的系统上的nobody组是我建议您执行的操作,以确保该组是对将要使用的任何文件都没有权限的组。从理论上讲,/sbin/nologin作为外壳,它不应该被使用,它也将没有/etc/shadow条目,因此没有密码。从理论上讲应该没问题,但请确保不要以某种方式让您以该帐户身份登录。

附带说明:我绝不是说这是一个好主意,但是它将完成您想要的功能。

编辑:为完整性起见,这是VarunAgw建议的:您可以正常添加用户useradd -s /sbin/nologin -N tmp,然后进行修改/etc/passwd/etc/shadow并将用户更改为tmp~并更改其位置home directory


不用更改UID和GID,我们只需useradd 'tmp'再替换tmp~
VarunAgw 2015年

真正。好建议。我不确定如何通过shadow条目使它合法化,但是我想只要没有设置密码就不会带来额外的风险。
肉汁

8

您可以使用CDPATH,并~~ 在一个CDPATH组件之一中放置一个原义命名的目录。

man bash(但CDPATH在中也可用sh

cd命令的搜索路径。这是一个用冒号分隔的目录列表,外壳程序在其中查找cd命令指定的目标目录。示例值为“。:〜:/ usr”。

那会让你做cd ~~

如果您想vi ~~/someFile在目录树中的任何位置进行操作,那么如果您坚持要~~字面上的意思,除非您对外壳程序进行了黑客攻击,否则您很不走运,但是,您可以使用变量或环境变量来存储魔术目录,以便您可以执行,例如$tilda/someFile

我通常将经常访问的文件放在主目录的~/b简称目录中,以便可以使用诸如或的路径访问它们~/l

自然地,通常可以根据需要用目录的符号链接替换目录。


1

外壳的~波浪号扩展大部分是可编程的。它可以扩展到在其尾随上下文中声明的系统用户名的用户目录(并且已经提供了沿这些方面的出色解决方案)$HOMEshell变量的值,或者根本不扩展。

所以:

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

/tmp
/home/mikeserv

$HOME一直都在更改,并且在shell的环境文件中保留了一个函数以进行重置:

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

如果您想以~某种方式使用代字号而不引用您的主目录,请使用。重新分配$HOME。不要害怕。$HOME与其他变量一样,只是一个shell变量。


我的另一个建议是对@PSkocik有关使用的出色建议仅做些微扩展$CDPATH。他没有提到的一件事是,您可以使用和更改$CDPATH内联而不需要完全更改当前的shell值$CDPATH。例如:

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

/tmp/1/2

cd必须是内置的Shell,但不是POSIX 特殊的 Shell内置,因此声明for的值$CDPATH不会影响其当前Shell的值。如果您像我一样使用它,$CDPATH则只会针对一个cd命令的环境更改的值,之后将其恢复为先前的值。与历史记录完成功能结合使用时,我倾向于发现上述技术最有用。我将执行上述操作,转到目录,运行一些命令,然后按向上直到我回到cd命令并在一个或两个路径段后退空格以移至其他位置。


现在,如果您将这两个概念结合在一起,则可以使先前使用的命令在下次使用时的含义完全不同。

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

/tmp/1/2
/home/mikeserv/1/2

0

作为bash函数,效果很好:

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

这是另一种更接近的方法(我知道我没有达到要求的程度)

function ~~ { echo /test; }

然后再添加几个字符:

cd `~~`/subdir
vi `~~`/file

2
好吧,cd ~~/foo/bar会不会做得这么好,或者vim ~~/foo.txt等等……
derobert

1
问题尚不清楚。如果这是理想的用法,我将使用CDPATH变量来处理这种cd情况。
glenn jackman

同意尚不完全清楚,但是OP确实要求它像那样工作~。并且~不像命令那样使用。
derobert

我自己觉得这是可以理解的,即使不是很清楚。问题CDPATH在于它不适用于CD以外的命令。IE浏览器您可以cd ~~或可以cd ~~/testdir1但不能vim ~~testdir1
Gravy 2015年

您最好使用别名来调用函数。喜欢alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.