通过 gnome-terminal 执行 bash 命令时未存储变量

通过 gnome-terminal 执行 bash 命令时未存储变量

我有一个插件,它可以生成并复制到剪贴板一个准备粘贴的命令,然后创建一个我想要通过用户输入移动和重命名的文件。

如果我使用它来获取目录中最新修改的文​​件,那么该文件将被正确复制并重命名,如脚本中指定的那样:

#!/bin/bash
gnome-terminal --tab-with-profile=PROFILENAME --working-directory="/PATH/WAY" -x bash -c "$(xclip -se c -o); find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/home.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/test.txt; read -p 'Press Enter to close.'"

但是,如果我尝试像这样添加用户输入,那么变量似乎没有被设置:

gnome-terminal --tab-with-profile=PROFILENAME --working-directory="/PATH/WAY" -x bash -c "$(xclip -se c -o); echo File name?; read newfile; echo File will be named $newfile.txt; find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/PATH.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/$newfile.flv; read -p 'Press Enter to close.'"

因为输出显示File will be named .txt我正在等待File will be named USERINPUT.txt,但文件未被复制。

有趣的是,如果我在这样的 Bash 脚本中使用这些命令,那么一切都正常:

#!/bin/bash
echo File name?
read newfile
echo File will be named $newfile.txt
find /PATH/WAY -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort -r | head -n1 | grep -o "/PATH.*" | xargs -I '{}' cp '{}' /PATH/TO/Desktop/$newfile.txt
read -p 'Press Enter to close.'

我不明白我做错了什么......

答案1

后面的单个大参数bash -c在双引号内。这意味着,某些内容(包括$newfile)的替换在这里由最外层的 shell(即即将启动 gnome-terminal 的 shell)在启动之前执行。在这种情况下,此变量未定义。

我建议你使用单独的脚本,正如你在帖子底部所展示的那样。单行代码无论如何都很难读懂。

其他可能性包括在命令行中交换'"引号,以便这'是最外层的(也就是说,$newline保持不变$newline并且不被最外层的 shell 替换,它稍后由 gnome-terminal 启动的 shell 进行解释);或者将符号$转义$newfile\$newfile

我们正在做这件事:

$(xsel ...)将剪贴板的内容作为命令(或一系列命令)执行,无需任何验证。例如,如果您的剪贴板包含字符串rm -rf ~,则您的主目录将消失。我不确定您的意图是什么,但为了您的安全,您应该放弃这种方法并寻找其他解决方案!

echo File name?对名称由五个字符name和一个任意字符组成的文件执行 shell 模式匹配。使用一对单引号或双引号。

您引用变量名称$newfile时没有使用引号。如果变量名称包含空格,则会导致错误行为。请改用 as 来引用"$newfile"

相关内容