我在使用 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 传递~/test2
给dd
,而不是/home/christoph/test2
?
zsh 在 Linux 上的行为相同。事实上,我执行了上面的这些命令,并在 Linux 机器上复制了它们的输出。
我想~~
指向一个不同的目录,这样我就可以将它用作快捷方式。我希望它具有与~
. 我怎样才能做到这一点?
我失去了几个小时试图运行 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 拒绝展开波浪号?我认为只要不引用波浪号,它就会一直扩展,但显然还有另一个规则在起作用?
请考虑以下片段:
$ 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:答案可能很明显,但不适合我。
> 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?
我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 中,事情按预期工作
如果我用引号定义一个变量:
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)
我对它们之间的区别感到很困惑,我想知道我应该在何时何地分别使用这两种定义?
/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 脚本中得到了扩展,但不知道如何解决这个问题。
先感谢您。
我想知道为什么在打开 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
我正在使用名为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 …