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

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

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

答案1

其实是有办法的,虽然不是很好的办法,但是也是一个办法,哈哈!

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

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

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

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

附带说明:我并不是说这是一个好主意,但它会实现您想要的功能。

编辑:为了完整起见,这是@VarunAgw 建议的:

您可以像平常一样添加用户useradd -s /sbin/nologin -N tmp,然后修改/etc/passwd和更改/etc/shadow用户并更改主目录的位置。tmp~

答案2

您可以利用 CDPATH 并~~ 在 CDPATH 组件之一中放置一个按字面命名的目录。

来自man bash(但 CDPATH 即使在 中也可用sh

cd 命令的搜索路径。这是一个以冒号分隔的目录列表,shell 在其中查找 cd 命令指定的目标目录。示例值为“.:~:/usr”。

那会让你做的cd ~~

如果你想vi ~~/someFile从目录树中的任何地方做类似的事情,那么如果你坚持字面意思,那么你就不走运了,~~除非你破解你的 shell,但是,你可以使用变量或环境变量来存储你的魔法目录,这样你就可以做,例如,$tilda/someFile

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

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

答案3

壳的~波浪线展开式为大多可编程的。它扩展到在其尾随上下文中声明的系统用户名的用户目录(并且已经提供了沿着这些思路的优秀解决方案),shell 变量的值$HOME或者一点也不。

所以:

(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

答案4

与 bash 函数完美配合:

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

这是另一种更接近的方法(我知道我没有那么接近要求)

function ~~ { echo /test; }

然后还有几个角色:

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

相关内容