小编qnt*_*ntm的帖子

GNU可以使用空格来处理文件名吗?

我有一个包含多个文件的目录,其中一些文件的名称中有空格:

Test workspace/
Another directory/
file1.ext
file2.ext
demo 2012-03-23.odp
Run Code Online (Sandbox Code Playgroud)

$(wildcard)在这个目录上使用GNU的命令,然后使用遍历结果$(foreach),打印出所有内容.这是代码:

FOO := $(wildcard *)
$(info FOO = $(FOO))
$(foreach PLACE,$(FOO),$(info PLACE = $(PLACE)))
Run Code Online (Sandbox Code Playgroud)

以下是我希望看到的内容:

Test workspace
Another directory
file1.ext
file2.ext
demo 2012-03-23.odp
Run Code Online (Sandbox Code Playgroud)

这是我真正得到的:

Test
workspace
Another
directory
file1.ext
file2.ext
demo
2012-03-23.odp
Run Code Online (Sandbox Code Playgroud)

后者对我来说显然毫无用处.该文档$(wildcard)它返回一个"名字的空格分隔的名单",但完全平整出国家不承认这引起了巨大的问题.也不对文件进行$(foreach).

有可能解决这个问题吗?如果是这样,怎么样?重命名每个文件和目录以删除空格不是一个选项.

shell gnu makefile

69
推荐指数
4
解决办法
3万
查看次数

如何在Bash中转义任意字符串以用作命令行参数?

我有一个字符串列表,我想在单个Bash命令行调用中将这些字符串作为参数传递.对于简单的字母数字字符串,只需逐字传递即可:

> script.pl foo bar baz yes no
foo
bar
baz
yes
no
Run Code Online (Sandbox Code Playgroud)

我理解如果一个参数包含空格或反斜杠或双引号,我需要反斜杠 - 转义双引号和反斜杠,然后双引号参数.

> script.pl foo bar baz "\"yes\"\\\"no\""
foo
bar
baz
"yes"\"no"
Run Code Online (Sandbox Code Playgroud)

但是当参数包含感叹号时,会发生以下情况:

> script.pl !foo
-bash: !foo: event not found
Run Code Online (Sandbox Code Playgroud)

双引号不起作用:

> script.pl "!foo"
-bash: !foo: event not found
Run Code Online (Sandbox Code Playgroud)

反斜杠也不会逃避(注意输出中的字面反斜杠如何):

> script.pl "\!foo"
\!foo
Run Code Online (Sandbox Code Playgroud)

我对Bash了解不多,但我知道还有其他特殊字符可以做类似的事情.在Bash中安全地转义任意字符串以用作命令行参数的一般过程是什么?假设字符串可以是任意长度并包含特殊字符的任意组合.我想要一个escape()子程序,我可以使用如下(Perl示例):

$cmd = join " ", map { escape($_); } @args;
Run Code Online (Sandbox Code Playgroud)

下面是一些应该通过此函数安全转义的示例字符串(我知道其中一些看起来像Windows,这是故意的):

yes
no
Hello, world      [string with a comma and space in it]
C:\Program Files\ [path …
Run Code Online (Sandbox Code Playgroud)

bash perl

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

图像和存储库之间有什么区别?

我是Docker的新手,并遵循入门教程.在第7步,它说

键入docker images命令并按RETURN.该命令列出本地系统上的所有映像.你应该docker/whalesay在列表中看到.

$ docker images
REPOSITORY           TAG         IMAGE ID            CREATED            VIRTUAL SIZE
docker/whalesay      latest      fb434121fc77        3 hours ago        247 MB
hello-world          latest      91c95931e552        5 weeks ago        910 B
Run Code Online (Sandbox Code Playgroud)

但第一栏清楚地说"存储库",而不是例如"图像名称".我也注意到在其他人的机器上,因为图像可以有多个标签,所以这个列表通常包含重复的条目 - 每个标签一个.这是一个图像列表,一个存储库列表,一个图像标签组合列表或其他什么?图像和存储库之间有什么区别?

另外,鉴于图像和存储库是不同的东西,我怎么才能列出我的存储库?

这与容器无关.

docker

30
推荐指数
4
解决办法
7727
查看次数

为什么这个Bash脚本没有错误?

这是我的Bash脚本:

#!/bin/bash -e

if [ == "" ]; then
  echo "BAD"
  exit 1
fi

echo "OK"
Run Code Online (Sandbox Code Playgroud)

这是输出:

./test.sh: line 3: [: ==: unary operator expected
OK
Run Code Online (Sandbox Code Playgroud)

返回码为0.

在第3行有一个明显的语法错误.而不是提出语法错误并拒绝运行脚本,不知何故脚本运行并在运行时报告语法错误.该-e标志并未保护我 - 显然if语句中的语法错误构成错误条件而不是立即退出程序的理由.但是,不知怎的,Bash 已经解析了整个if ... fi块,所以在忽略坏线之后,执行会以某种方式恢复,而不是在下一个语法正确的行但是在块结束之后?

我有两个问题:

  1. 到底是怎么回事?
  2. 我将来如何保护自己免受这种行为的影响?

bash

17
推荐指数
3
解决办法
1063
查看次数

为什么Python的非本地关键字不像全局范围?

在Python 3.3.1中,这适用于:

i = 76

def A():
    global i
    i += 10

print(i) # 76
A()
print(i) # 86
Run Code Online (Sandbox Code Playgroud)

这也有效:

def enclosing_function():
    i = 76
    def A():
        nonlocal i
        i += 10

    print(i) # 76
    A()
    print(i) # 86

enclosing_function()
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

i = 76
def A():
    nonlocal i # "SyntaxError: no binding for nonlocal 'i' found"
    i += 10

print(i)
A()
print(i)
Run Code Online (Sandbox Code Playgroud)

nonlocal关键字状态的文档(强调添加):

非本地语句使列出的标识符引用最近的封闭范围中的先前绑定的变量.

在第三个例子中,"最近的封闭范围"恰好是全局范围.那为什么不起作用呢?

请仔细阅读本章

我注意到文档继续进行状态(强调添加):

除了全局(模块)范围nonlocal之外,[ ]语句允许封装代码重新绑定局部范围之外的变量.

但是,严格地说,这并不意味着我在第三个例子中所做的事情不应该起作用.

python python-3.x

14
推荐指数
3
解决办法
2657
查看次数

如何使用负偏移量在bash中使用字符串的后缀?

我试图使用${string:pos}子串语法在Bash中获取字符串的后缀,但我无法弄清楚为什么它不起作用.我设法将我的示例代码简化为:

STRING="hello world"

POS=4
echo ${STRING:POS} # prints "o world"
echo ${STRING:4}   # prints "o world"

POS=-4
echo ${STRING:POS} # prints "orld"
echo ${STRING:-4}  # prints "hello world"
Run Code Online (Sandbox Code Playgroud)

前三行完全按照我的预期工作,但为什么最后一行打印"hello world"而不是"orld"

bash shell

13
推荐指数
2
解决办法
334
查看次数

为什么Groovy用size()替换java.lang.String.length()?

Wikipedia 目前关于Groovy编程语言的文章解释说"大多数有效的Java文件也是有效的Groovy文件",并提供以下示例,首先是Java代码:

for (String it : new String[] {"Rod", "Carlos", "Chris"})
    if (it.length() <= 4)
        System.out.println(it);
Run Code Online (Sandbox Code Playgroud)

然后在Groovy中相同:

["Rod", "Carlos", "Chris"].findAll{it.size() <= 4}.each{println it}
Run Code Online (Sandbox Code Playgroud)

请注意,在第一个示例中,我们使用了完全普通的Java方法java.lang.String.length().在第二个例子中,这个方法已被神秘地替换为对一个名为的方法的调用size().我已经验证第二个示例是有效的Groovy代码并且具有正确的行为.

java.lang.String没有一个叫做的方法size().Groovy没有String为自己的目的进行子类化:

String s = ""
Class c = s.getClass()
println c.getName() // "java.lang.String"
Run Code Online (Sandbox Code Playgroud)

它也不会以某种方式为String对象添加额外的方法:

// [...]
for (def method : c.getMethods()) {
    println method.getName()
}
// prints a whole bunch of method names, no "size"
Run Code Online (Sandbox Code Playgroud)

但仍然这个代码以某种方式工作:

// [...]
println s.size() …
Run Code Online (Sandbox Code Playgroud)

java string groovy jvm-languages

12
推荐指数
2
解决办法
1万
查看次数

为什么Perl抱怨"在void上下文中无用的常量",但有时只是?

这是我的Perl脚本及其输出:

use strict;
use warnings;

(undef, 1); # no output
(0, 1);     # no output
(1, 1);     # no output
(2, 1);     # "Useless use of a constant in void context at C:\...\void.pl line 7"
(3, 1);     # "Useless use of a constant in void context at C:\...\void.pl line 8"
("", 1);    # "Useless use of a constant in void context at C:\...\void.pl line 9"
("0", 1);   # "Useless use of a constant in void context at C:\...\void.pl line 10" …
Run Code Online (Sandbox Code Playgroud)

perl constants void

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

为什么这个(大部分)空的Perl子例程返回一个空字符串?

这是一个Perl程序:

use strict;
use warnings;

use Data::Dumper;

sub f {
  foreach (()) { }
}

print Dumper(f());
Run Code Online (Sandbox Code Playgroud)

这输出:

$VAR1 = '';
Run Code Online (Sandbox Code Playgroud)

由于没有显式返回值f,并且没有在其中计算表达式,结果不应该是undef?空字符串来自哪里?

perl

9
推荐指数
2
解决办法
299
查看次数

如何在Windows中转义任意字符串以用作命令行参数?

我有一个字符串列表,我想在单个Windows命令行调用中将这些字符串作为参数传递.对于简单的字母数字字符串,只需逐字传递即可:

> script.pl foo bar baz yes no
foo
bar
baz
yes
no
Run Code Online (Sandbox Code Playgroud)

我理解如果一个参数包含空格或双引号,我需要反斜杠 - 转义双引号和反斜杠,然后双引号参数.

> script.pl foo bar baz "\"yes\"\\\"no\""
foo
bar
baz
"yes"\"no"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用字面百分号传递参数时,会发生这种情况:

> script.pl %PATH%
C:\Program
Files\PHP\;C:\spaceless\perl\bin\;C:\Program
Files\IBM\Java60\bin;
(...etc.)
Run Code Online (Sandbox Code Playgroud)

双引号不起作用:

> script.pl "%PATH%"
C:\Program Files\PHP\;C:\spaceless\perl\bin\;C:\Program Files\IBM\Java60\bin; (...etc.)
Run Code Online (Sandbox Code Playgroud)

也没有反斜杠转义(注意输出中的反斜杠如何):

> script.pl \%PATH\%
\%PATH\%
Run Code Online (Sandbox Code Playgroud)

此外,规则与反斜杠转义反斜杠不一致:

> script.pl "\\yes\\"
\\yes\
> script.pl "\yes\\"
\yes\
> script.pl "\yes\"
\yes"
Run Code Online (Sandbox Code Playgroud)

此外,毫无疑问,Windows命令行shell中有特殊字符,就像所有shell中都有一样.那么,安全地转义任意命令行参数以便在Windows命令行中使用的一般过程是什么?

理想的答案将描述一个escape()可以在以下情况下使用的函数(Perl示例):

$cmd = join " ", map { escape($_); } @args;
Run Code Online (Sandbox Code Playgroud)

这里有一些更多的示例字符串应该由此函数安全地转义(我知道其中一些看起来像Unix一样,这是故意的):

yes
no
child.exe
argument …
Run Code Online (Sandbox Code Playgroud)

windows shell cmd

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

标签 统计

bash ×3

perl ×3

shell ×3

cmd ×1

constants ×1

docker ×1

gnu ×1

groovy ×1

java ×1

jvm-languages ×1

makefile ×1

python ×1

python-3.x ×1

string ×1

void ×1

windows ×1