如何在 WSL/Ubuntu/Bash 中使用两个波浪号字符“~~”(或类似字符)创建路径的快捷方式?

Viv*_*ere 10 bash ubuntu windows-subsystem-for-linux

我是 Ubuntu/Linux 世界的新手,所以不要对我太苛刻。

我在带有 WSL2 和 bash shell 的 Windows 上使用 Ubuntu。有时我想将文件从 Windows 复制到 Ubuntu 或其他方式。我在网上找到了一些关于如何执行此操作的教程,最简单的方法是导航到/mnt/c/Users/<your_user>.

我想创建一个像波浪号~这样的变量,这意味着我的 Windows 用户的主目录。我考虑过使用双波浪号,~~因为我看到它不是保留的或其他东西。

我在/bin命名中创建了一个可执行文件,~~echo是必要的路径。但是使用起来很麻烦。

有没有办法创建一个特殊的角色~?如果没有,有没有更好的方法来做到这一点?

我想要的最终结果是能够执行以下操作:

cp ~~/Desktop/somefile.txt ~/somefile.txt
Run Code Online (Sandbox Code Playgroud)

Adm*_*Bee 13

在您的情况下,您可能可以改用 shell 变量。你可以称之为$WHeg ,它仍然相当短:

~$ export WH=/mnt/c/Users/your_user
Run Code Online (Sandbox Code Playgroud)

这会将变量设置WH为您的 Windows 主目录并将其导出为环境变量。然后你可以像这样使用这个变量

~$ cp $WH/Desktop/somefile.txt ~/somefile.txt
Run Code Online (Sandbox Code Playgroud)

要使此设置永久化,您可以将此变量规范添加到您的.bashrc文件中。

请注意,如果 Windows 主目录的路径包含空格,则必须在变量定义和以后使用时引用该路径:

export WH="/mnt/c/Users/your user"
Run Code Online (Sandbox Code Playgroud)

在你.bashrc

~$ cp "$WH"/Desktop/somefile.txt ~/somefile.txt
Run Code Online (Sandbox Code Playgroud)

在控制台上使用时。


Not*_*1ds 11

我在 WSL 下的解决方案是在我的主目录中创建一个指向我的 Windows 配置文件的符号链接。我个人使用:

ln -s /mnt/c/Users/<username> ~/winhome
Run Code Online (Sandbox Code Playgroud)

但你可以缩短它。在 下bash,至少~~ 看起来也可以用作符号链接名称,但我担心在某些情况下它可能会被误解。如果你想尝试这条路线:

ln -s /mnt/c/Users/<username> ~/~~
Run Code Online (Sandbox Code Playgroud)

然后访问它就变成了这样:

cp ~/myfile ~/~~/Documents/
Run Code Online (Sandbox Code Playgroud)


JoL*_*JoL 10

我知道这个问题被标记为bash,但如果你使用zsh,你可以这样做:

hash -d w='/mnt/c/Users/<your_user>'
Run Code Online (Sandbox Code Playgroud)

有了那个,~w就会扩展到那个路径。这是一个“静态命名目录”。这就像 AdminBee 的建议使用变量扩展,但一个区别是选项卡完成将用于扩展~w/. 此外,如果您在该目录下并且您的提示设置为显示您的当前目录,它将显示带有命名目录的简短版本,而不是扩展的完整路径。

~是此功能的无效字符,因此~~不能使用。


Not*_*1ds 9

此外,对于适用于大多数 shell(至少 Bash、Fish、Zsh 甚至 Dash)的@JoL 答案的方法,您可以简单地创建一个以w指向您的 Windows 用户配置文件的主目录命名的新用户。然后~w/成为捷径。似乎也可以~用于用户名,从而产生~~快捷方式。详情请见下文。

在 WSL 上为此目的创建用户确实没有任何缺点,因为没有用户级安全的概念(即wsl -u root,您已经可以在没有密码的情况下完全访问 WSL 实例中的所有内容)。

一个简单的 ...

sudo useradd --home-dir /mnt/c/Users/<username> w
Run Code Online (Sandbox Code Playgroud)

...将适用于 WSL。但是,“最佳实践”可能更像是:

sudo useradd --no-user-group --non-unique -u 1000 -g 1000 --shell /sbin/nologin -f0 -e0 --home-dir /mnt/c/Users/<username> w
Run Code Online (Sandbox Code Playgroud)

这将创建一个w与主要 WSL用户具有相同用户 ID 和组 ID (1000:1000) 的用户(这只是我的个人偏好,以避免不必要的 uids/gids 污染系统)。该用户将拥有 nologin shell、过期密码和锁定帐户。同样,并不是说 WSL 真的需要这种额外的“安全性”。

与 JoL 的回答一样,这将允许:

cp ~/myfile ~w/Documents/
Run Code Online (Sandbox Code Playgroud)

需要注意的是,这在某些极端情况下可能会导致问题,您可以使用useradd's--badname选项强制它接受~作为用户名:

sudo useradd --badname --home-dir /mnt/c/Users/<username> "~" # or ...
sudo useradd --badname --no-user-group --non-unique -u 1000 -g 1000 --shell /sbin/nologin -f0 -e0 --home-dir /mnt/c/Users/<username> "~"
Run Code Online (Sandbox Code Playgroud)

导致您的原始请求:

cp ~/myfile ~~/Documents
Run Code Online (Sandbox Code Playgroud)