标签: tilde

zsh 中波浪号的扩展

我在使用 FreeBSD 时偶然发现了 zsh 的这种行为:

% dd if=/dev/zero bs=1M count=1 of=~/test2
dd: failed to open '~/test2': No such file or directory
Run Code Online (Sandbox Code Playgroud)

这真的让我很困惑,因为同样的事情在 bash 中工作得很好。

我可以touch在 zsh 中使用波浪号文件,然后ls它们:

% touch ~/test2
% ls ~/test2
/home/christoph/test2
Run Code Online (Sandbox Code Playgroud)

起初,我认为 zsh 没有意识到后面有一条路径,of=所以它没有扩展~。但是自动完成文件名工作得很好。事实上,如果使用现有文件名,以 开头~,然后在某个时候按 Tab,路径会在我输入的命令中展开。

为什么 zsh 传递~/test2dd,而不是/home/christoph/test2

zsh 在 Linux 上的行为相同。事实上,我执行了上面的这些命令,并在 Linux 机器上复制了它们的输出。

zsh tilde

11
推荐指数
1
解决办法
4230
查看次数

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

我想~~指向一个不同的目录,这样我就可以将它用作快捷方式。我希望它具有与~. 我怎样才能做到这一点?

bash ubuntu tilde

10
推荐指数
2
解决办法
6197
查看次数

为什么波浪号 (~) 在与以破折号开头的 CLI 参数一起使用时不会扩展?

我失去了几个小时试图运行 VNC 服务器 (x0vncserver) 并且客户端拒绝连接奇怪的消息

No password configured for VNC Auth
Run Code Online (Sandbox Code Playgroud)

服务器也打印此错误

 SVncAuth:    opening password file '~/.vnc/passwd' failed
Run Code Online (Sandbox Code Playgroud)

好吧,我浪费了很多时间,直到我意识到波浪号既不是由 shell 扩展的,也不是由 x0vncserver 扩展的。然后我运行了这些测试

$ echo --PasswordFile=~/.vnc/passwd
--PasswordFile=~/.vnc/passwd
Run Code Online (Sandbox Code Playgroud)

$ echo PasswordFile=~/.vnc/passwd
PasswordFile=/home/tichomir/.vnc/passwd
Run Code Online (Sandbox Code Playgroud)

这是为什么?如果参数以破折号开头,为什么 shell 拒绝展开波浪号?我认为只要不引用波浪号,它就会一直扩展,但显然还有另一个规则在起作用?

shell bash tilde

10
推荐指数
1
解决办法
1256
查看次数

Bash 中的波形符扩展与变量

请考虑以下片段:

$ export xx=foo
$ sudo bash -c 'echo $xx ~'
/root
Run Code Online (Sandbox Code Playgroud)

这没关系。我们看不到xx。

但是,如果我暴露它:

$ sudo -E bash -c 'echo $xx ~'
foo /home/xropi
Run Code Online (Sandbox Code Playgroud)

尽管很多人说~不是别名,但不知何故它是环境的一部分,因为-E会暴露原始内容,阻止我推迟其评估。

是否可以在 sudo-ed 命令中传递我的变量并将 ~ 评估为 /root ?

我想在使用 sudo 运行时得到这个:

foo /root
Run Code Online (Sandbox Code Playgroud)

bash sudo environment-variables tilde

5
推荐指数
1
解决办法
945
查看次数

读取链接文字与变量

使用 BASH:答案可能很明显,但不适合我。

> echo $PWD
/root/fcm
> readlink -f ~
/root
> # but then with a variable or literal
> a='~'
> readlink -f $a
/root/fcm/~
> readlink -f "~"
/root/fcm/~
Run Code Online (Sandbox Code Playgroud)

我期待收到'/root/';
谁在进行替换 bash 或 readlink?

shell bash quoting variable-substitution tilde

4
推荐指数
1
解决办法
743
查看次数

在 zsh 中找不到命令,但在 bash 中找到

zsh在 ubuntu 上使用,并为此创建了一个符号链接bat

ln -s /usr/bin/batcat /home/user_name/.local/bin/bat

ls -l~/.local/bin显示:

lrwxrwxrwx 1 tux tux 15 May 19 13:47 bat -> /usr/bin/batcat

现在从任何目录(甚至在~/.local/bin),

如果我跑bat,我得到command not found: bat。跑~/.local/bin也行不通。但是,运行./bat(from ~/.local/bin) 确实有效。跑步batcat也有效。

echo $PATH显示~/.local/bin在路径中

这里可能出了什么问题?没有符号链接有效,bat只是一个例子

PS 在 bash 中,事情按预期工作

bash zsh path home tilde

4
推荐指数
1
解决办法
611
查看次数

定义带引号和不带引号的变量有什么区别?

如果我用引号定义一个变量:

TEMP="~/Dropbox"
Run Code Online (Sandbox Code Playgroud)

然后

ls $TEMP
Run Code Online (Sandbox Code Playgroud)

不会工作,而是

echo $TEMP | ls
Run Code Online (Sandbox Code Playgroud)

作品。

为了获得相同的结果,我还可以定义不带引号的变量,例如:

TEMP=~/Dropbox
Run Code Online (Sandbox Code Playgroud)

这样做我可以简单地输入

ls $TEMP
Run Code Online (Sandbox Code Playgroud)

我对它们之间的区别感到很困惑,我想知道我应该在何时何地分别使用这两种定义?

bash quoting variable assignment tilde

3
推荐指数
1
解决办法
1231
查看次数

Bash 脚本将文件复制到用户的(通配符)主目录

/root/nbu/file1.sh如果用户的 id 是偶数,我需要复制到每个用户的主目录。

尝试执行以下脚本:

#!/bin/bash
cat /etc/passwd | while read LINE
do
    username=$(awk -v var="$LINE" -F: '{
        if ($3 % 2 == 0)
           print $1
        }')
    cp /root/nbu/file1.sh ~"$username"
done
Run Code Online (Sandbox Code Playgroud)

它什么都不做。如果我回显cp /root/nbu/file1.sh ~"$username"命令并直接在脚本中执行它,它就可以工作。

我想问题是~在 bash 脚本中得到了扩展,但不知道如何解决这个问题。

先感谢您。

cp shell-script wildcards tilde

3
推荐指数
2
解决办法
1266
查看次数

为什么打开 .bashrc 文件时要在 .bashrc 之前加上 ~/ ?

我想知道为什么在打开 bashrc 文件时需要将 ~/ 放在 .bashrc 之前。

为了显示:

我通常在我的系统上打开文件如下:

vim filename.extension 
Run Code Online (Sandbox Code Playgroud)

但是在 /home 目录中,如果我执行以下操作:

vim .bashrc 
Run Code Online (Sandbox Code Playgroud)

vim 将打开一个名为 .bashrc 的新文件

为了打开我的 bashrc 文件,我必须执行以下操作:

vim ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

为什么?

我当前的系统是 Linux Mint 18.3

linux bash tilde

3
推荐指数
2
解决办法
5035
查看次数

在 Bash 的字符串变量中使用 ~ 和不使用 ~ 有什么不同?

我正在使用名为dotdrop的 dotfile 管理软件。使用名为 的配置文件.env,内容如下:git_folder="~/code/Git".

在第一次使用它之前,也使用脚本来设置这个dotfile工具,如下所示,

#!/bin/bash

env1="~/Dropbox/.env"
env2="/mnt/d/Dropbox/.env"

if [ -f $env1 ]; then
    echo "Found dotdrop env file, installing dotfiles..."
    source $env1
    eval $(grep -v "^#" $env1) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
elif [ -f $env2 ]; then
    echo "Found dotdrop env file, installing dotfiles..."
    source $env2
    eval $(grep -v "^#" $env2) dotdrop --cfg=${git_folder}/dotfiles/config.yaml install
else echo "Pls sync environment files first!"
fi
Run Code Online (Sandbox Code Playgroud)

如果我将我的配置文件存储在~/Dropbox/.env,当我运行脚本时,我就会得到"Pls sync environment files first!"(如果条件是预期的,则运行)。如果配置文件存储在/mnt/d/Dropbox/.env,脚本将通过 elif …

shell bash quoting home tilde

3
推荐指数
1
解决办法
691
查看次数