我是 Linux 环境的新手。快速搜索后,我找不到有关 bash 脚本中使用的 $ 运算符的有用问题。我不知道这个问题是否与 Ubuntu(或其他)Linux 版本有关,或者与我非常少的编程经验有关。
基本上,我认为 Linux 中的 ~ 操作数与字符串“/home/username”完全等同。如果我尝试使用 bash 脚本和外部基于 C 的程序在一定延迟后执行程序,我会陷入困境:我无法使用 ~ 操作数并让程序对用户保持无动于衷(尽管必须尊重文件路径的其余部分)。
请对以下内容提供评论(查找 getIdle 源留给读者):
#!/bin/bash
# call.sh
idle=false
idleAfter=30000 # consider idle after 30000 ms
# EXPLAIN THIS - Begin
# Strings that work
# str_getIdle_exe='/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="/home/seb/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"
# Strings that don'work
str_getIdle_exe='~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle'
# str_getIdle_exe="~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle"
# EXPLAIN THIS - End
while true; do
idleTimeMillis= $str_getIdle_exe
echo $idleTimeMillis # just for debug purposes.
if [[ $idleTimeMillis -gt $idleAfter && $idle = false ]] ; then
echo "start idle" # or whatever command(s) you want to run...
idle=true
/usr/bin/xflock4
else # just for debug purposes.
echo "not there yet..."
fi
if [[ $idleTimeMillis -lt $idleAfter && $idle = true ]] ; then
echo "end idle" # same here.
idle=false
fi
sleep 1 # polling interval
done
我想要解释的是:为什么上面两个不同的字符串在 shell 中执行得很好,但在脚本调用时却不行?
我正在使用 Linux Mint 17.1 “Rebecca” Xfce(64 位)。
非常感谢。
答案1
在引号中时波浪号不会展开——参考:https://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion
因此您想删除引号:
str_getIdle_exe=~/Documents/Seb/Prjcts/Idle/getidle/src/getIdle
如果您的主目录下的路径包含空格,则只需将波浪号保留为不加引号即可:
some_path=~/"dir with spaces/file with spaces"
答案2
波浪号在引号(单引号或双引号)中不会展开。
您有三个选择:
删除引号:
string="~/hello"
->string=~/hello
(容易受到空白的影响)使用命令替换:
string="~/hello"
->string="$(echo ~/hello)"
(较不脆弱)按照@steeldriver 的建议,使用
HOME
环境变量:string="~/hello"
->string="$HOME/hello"