小编Jon*_*ler的帖子

保护包含空格的参数免受 eval 影响

为了让 eval 能够处理参数之一内包含空格的命令,到目前为止我只发现它可以工作:

eval 'sed 's/foo/foo'" "'bar/g' filename'
Run Code Online (Sandbox Code Playgroud)

在一个假设的程序中,用户输入命令,然后将命令和参数输入到 eval,这不是一个非常优雅或强大的解决方案。是否有其他方法来运行 eval 命令,以便 my_command 的界面更加用户友好?以下是程序现在如何接受参数的示例。

my_command 'sed 's/foo/foo'" "'bar/g' filename'
Run Code Online (Sandbox Code Playgroud)

我希望界面能够像这样工作:

my_command sed 's/foo/foo bar/g' filename
Run Code Online (Sandbox Code Playgroud)

编辑:

我会尝试问一个不同的问题:

如何让 bash 从命令行读取输入?我希望保留确切的输入,因此如果有引号我想保留它们。我可以通过使用egrep从文件中读取然后清理输入来完成我想做的事情,如下所示:

egrep '/.*/' filename |
sed 's/\(.*\)['"'"']\(.*\) \(.*\)['"'"']\(.*\)/\1'"\'"'\2" "\3'"\'"'\4/g'
Run Code Online (Sandbox Code Playgroud)

“文件名”包含这一行

sed 's/foo/foo bar/g' file
Run Code Online (Sandbox Code Playgroud)

这给了我所需的输出:

sed 's/foo/foo" "bar/g' file
Run Code Online (Sandbox Code Playgroud)

这里的问题是我不能,echo "$@"因为 bash 解释引号。我想要文字输入而不必从文件中读取。

unix linux bash shell eval

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

令人困惑的shell语法

在来自Kernighan&Pike,Unix编程环境的一个例子中,作者在与命令相同的行中进行变量赋值.这条线是这样的:

if PATH=$opath "$@" >$new
Run Code Online (Sandbox Code Playgroud)

其中此行之前的变量值为:

PATH =/bin中:在/ usr/bin中

和opath =/a/really:/ long/list/of:/ pathnames

令我困惑的是,当我改变那条线时

if PATH=$opath echo $PATH
Run Code Online (Sandbox Code Playgroud)

标准输出是:

/斌:在/ usr/bin中

我已经在sh和bash中证实了这一点.谁能教育我Kearnighan&Pike在这里做什么?自1982年以来,shell实现的这一方面是否发生了变化?

编辑:这是本书的整个程序.

#!/bin/bash

# overwrite: copy standard input to output after EOF
# final version

opath=$PATH
PATH=/bin:/usr/bin

case $# in
0|1)        echo 'Usage: overwrite file cmd [args]' 1>&2; exit 2
esac

file=$1; shift
new=/tmp/overwr1.$$; old=/tmp/overwr2.$$
trap 'rm -f $new $old; exit 1' 1 2 15

if PATH=$opath "$@" >$new
then
    cp $file $old
    trap '' 1 2 …
Run Code Online (Sandbox Code Playgroud)

unix linux bash shell

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

标签 统计

bash ×2

linux ×2

shell ×2

unix ×2

eval ×1