小编Har*_*ikk的帖子

使用参数从stdin运行脚本命令

我有一个小帮助程序脚本的集合,用于更复杂的shell脚本,虽然这很好用,但我还是决定将其简化为单个脚本,原因有很多.

所以我想我会在这里使用文档,以便我可以创建"嵌套"shell脚本,以便在本地或远程运行.这很有效,因为我可以做到以下几点:

#!/bin/sh
nested_script=$(cat << 'NESTED_SCRIPT'
    # Script commands
NESTED_SCRIPT
)
echo "$nested_script" | sh
Run Code Online (Sandbox Code Playgroud)

不是最具功能性的例子,但我可以发送它的事实ssh使它非常有用.

但是,我遇到的问题是我无法弄清楚如何为嵌套脚本提供参数,就好像我向sh命令添加任何内容然后它将其解释为要运行的文件并完全忽略标准输入.

在我的本地机器上,我可以做到echo "$script" | sh /dev/stdin "foo" "bar"并且它可以完美地工作,但我不相信我正在使用的远程机器支持/dev/stdin这种方式的使用.

还有其他解决方案吗?目前我正在使用脚本字符串强制参数,sed但这不是一个非常好的方法.

对于那些想知道的人; 我试图这样做的原因是我的嵌套脚本可能在本地运行,或者可能是远程运行,具体取决于是否提供了主机.我真的不想在远程主机上创建文件来运行,而是只是远程运行命令,这种方法似乎可以启用(如果我可以让它像我想的那样工作).

ssh shell

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

将带后缀的文件大小转换为字节的最简单方法

标题确实说明了一切,但我目前正在使用一个带有 case 语句的简单函数将人类可读的文件大小字符串转换为以字节为单位的大小。它工作得很好,但是移植到其他代码中有点笨拙,所以我很想知道是否有任何广泛可用的命令可以替代 shell 脚本使用?

基本上我想获取诸如“100g”或“100gb”之类的字符串并将它们转换为字节。

我目前正在做以下事情:

to_bytes() {
    value=$(echo "$1" | sed 's/[^0123456789].*$//g')
    units=$(echo "$1" | sed 's/^[0123456789]*//g' | tr '[:upper:]' '[:lower:]')

    case "$units" in
        t|tb)   let 'value *= 1024 * 1024 * 1024 * 1024'    ;;
        g|gb)   let 'value *= 1024 * 1024 * 1024'   ;;
        m|mb)   let 'value *= 1024 * 1024'  ;;
        k|kb)   let 'value *= 1024' ;;
        b|'')   let 'value += 0'    ;;
        *)
                value=
                echo "Unsupported units '$units'" >&2
        ;;
    esac

    echo "$value"
} …
Run Code Online (Sandbox Code Playgroud)

shell

4
推荐指数
2
解决办法
4197
查看次数

在Shell脚本中设置和使用SSH ControlMaster会话

我正在编写一个脚本,其中包含需要在远程服务器上运行的几组命令,并在两者之间进行结果处理。当前,这是通过ssh为每组命令运行来实现的,但是,这每次都需要进行新连接的建立和身份验证,这很慢。

我最近阅读了有关ControlMasterSSH中的选项的信息,这似乎正是我所需要的,即能够通过单个SSH连接运行单独的SSH会话。

但是,我非常不清楚的是我将如何在shell脚本中实现这一目标。例如,我正在考虑像这样构造它:

#!/bin/sh
HOST="$1"

# Make sure we clean up after ourselves
on_complete() {
    kill $ssh_control_master_id
    rm -r "$tmp_dir"
}
trap 'on_complete 2> /dev/null' SIGINT SIGHUP SIGTERM EXIT

tmp_dir=$(mktemp -d "/tmp/$(basename "$0").XXXXXX")
ssh_control_socket="$tmp_dir/ssh_control_socket"

# Setup control master
ssh -o 'ControlMaster=yes' -S "$ssh_control_socket" "$HOST" &
ssh_control_master_id=$!

# Run initial commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Foo"')

# Process the data
echo "$data"

# Run some more commands
data=$(ssh -S "$ssh_control_socket" "$HOST" 'echo "Bar"')

# Process the …
Run Code Online (Sandbox Code Playgroud)

ssh shell

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

子shell中的变量内的引号

所以这是我遇到的一个奇怪的问题; 我有一个脚本试图构建一组命令来运行eval,这些脚本需要作为一堆其他命令的一部分在子shell中运行(所以我可以异步运行它们).这些命令包括用于保护内部空间等值的引用,但是它们被视为引文根本不存在.

例如:

cmd="echo 'Foo Bar'"
$(eval "$cmd" | sort) &
Run Code Online (Sandbox Code Playgroud)

结果出现"Foo:command not found"的错误

虽然运行它更直接工作得很好 - 所以:

eval "$cmd" | sort
Run Code Online (Sandbox Code Playgroud)

我意识到这个例子不是很有趣,但我不明白的是为什么报价丢失以及如何避免它,同时仍然在适当的子shell中执行(在后台处理和不处理).

shell quotes subshell

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

JSONEncoder不允许将类型编码为原始值

我正在Codableenum具有可能关联值的类型的实现工作.由于这些对于每种情况都是独一无二的,我认为在编码过程中我可以在没有键的情况下输出它们,然后简单地看一下我在解码时可以得到什么来恢复正确的情况.

这是一个非常简洁,人为的例子,演示了一种动态类型的值:

enum MyValueError : Error { case invalidEncoding }

enum MyValue {
    case bool(Bool)
    case float(Float)
    case integer(Int)
    case string(String)
}

extension MyValue : Codable {
    init(from theDecoder:Decoder) throws {
        let theEncodedValue = try theDecoder.singleValueContainer()

        if let theValue = try? theEncodedValue.decode(Bool.self) {
            self = .bool(theValue)
        } else if let theValue = try? theEncodedValue.decode(Float.self) {
            self = .float(theValue)
        } else if let theValue = try? theEncodedValue.decode(Int.self) {
            self = .integer(theValue)
        } else if let theValue = …
Run Code Online (Sandbox Code Playgroud)

swift codable

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

sed 扩展正则表达式的替代方案

我需要运行正则表达式来匹配字符串的一部分。在 OS XI 上会这样做:

echo "$string" | sed -E 's/blah(.*)blah/\1/g'
Run Code Online (Sandbox Code Playgroud)

但是,这种使用sed与其他平台不兼容,其中许多平台会使用 调用相同的命令sed -r

所以我正在寻找的是一种检测要使用哪个选项的好方法,或者是一种广泛可用(且兼容)的替代方案,sed我可以尝试做同样的事情(使用模式检索字符串的一部分)。

regex shell sed

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

静态块无法在Java中执行自注册对象

这是一个有点棘手的一个解释,但让我们说我有两个班的AB.A包含static由提供此类因子的每个对象注册的工厂对象的列表.在这个例子中B是这样一个类,并提供了一个虚构的Factory实现.

A类:

public class A {
    protected static Map<String, Factory> registered = new HashMap<String, Factory>();
    protected static register(String name, Factory factory) {
        registered.put(name, factory);
    }

    public A() {
        // Do something with the factories we've registered
    }
}
Run Code Online (Sandbox Code Playgroud)

B级:

public class B {
    static {
        A.register("Foo", new Factory() {
            public Object create() {
                return new B();
            }
        });
    }

    public B() {
        // Create a new instance of …
Run Code Online (Sandbox Code Playgroud)

java

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

为什么 sort(by:) 在 MutableCollection 的扩展中不可用?

我正在尝试编写一个MutableCollection需要使用sort(by:)排序方法的扩展,但是它似乎不适用于MutableCollection扩展,尽管已定义此方法MutableCollection(至少根据苹果开发人员文档)。

这是一个非常人为且简化的示例:

struct MyType { var priority:Int }
extension MutableCollection where Element == MyType {
    mutating func sort() { self.sort(by: { $0.priority > $1.priority }) }
}
Run Code Online (Sandbox Code Playgroud)

但这会导致错误Argument passed to call that takes no arguments,这是因为我自己的sort()方法此时被看到,似乎sort(by:)根本没有意识到。

如果我将扩展更改为 for 那么Array扩展就可以正常工作,但是当然它是特定于类型的,而不是应用于符合的所有类型MutableCollection,这就是我真正的意图(为了与可能的)。

sort(by:)为什么我此时无法查看和使用该方法,有什么方法可以解决这个问题吗?

extension-methods protocols swift

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

为 PHP7.2 创建 Google Cloud Storage 上传 URL

我觉得我在这里遗漏了一些东西,但是在标准环境中使用 PHP 5.5 的 Google App Engine 上,我可以非常轻松地为我的用户创建上传 URL 来上传文件,而不会在 PHP 中浪费时间,如下所示:

<?php
use google/appengine/api/cloud_storage/CloudStorageTools;

?><form action="<?php echo CloudStorageTools::createUploadUrl('my/upload/handler.php'); ?>" method="post">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>
Run Code Online (Sandbox Code Playgroud)

当然大大简化了(因为该 URL 只能持续 60 秒)。

但是,此 API 似乎不适用于运行 PHP 7.2 的应用程序引擎,我确实需要使用它,而且我似乎找不到用于获取上传 URL 的替代 API;这些真的停产了吗?

还有其他非常有用的功能,例如getImageURL()获取缩略图等。当然,很多文档仍然指向上述处理用户上传到应用引擎站点的方法!

那么如何在较新的 API 中创建和使用上传 URL?

google-app-engine google-cloud-storage google-cloud-platform php-7.2

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

填充UIScrollView的垂直空间

我正在制作一个有a的布局,UIScrollView我想做的是将一个标签固定在可滚动区域的顶部,并将一个固定在底部的按钮,两者之间的空间最小.

我们的想法是,如果标签的高度增加,按钮将被向下推,这样用户就必须向下滚动才能到达它.但是,如果标签很短,则它与按钮之间的空间应该增大,以使按钮停留在可滚动区域的底部.

下面是我的意思的粗略模型:

在此输入图像描述

注意:第二个镜头是在完全滚动到底部之后UIScrollView,我希望滚动到顶部时按钮被隐藏; 即 - 只需将按钮放在滚动视图下方就不是一种选择.

user-interface xcode ios

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

有效地将多列提取到变量中

这看起来应该很简单,但一直让我疯狂,试图找到一种方法来表达搜索来回答它.

很简单,我有一个文件结构为三列,包括名称,路径和模式.循环遍历这些行时,我想将其中的每一个提取到自己的变量中以供使用.

我目前的解决方案是(原谅错别字):

while read line
do
    name=$(echo "$line" | awk '{print $1}')
    path=$(echo "$line" | awk '{print $2}')
    pattern=$(echo "$line" | awk '{print $3}')
done < "myFile.txt"
Run Code Online (Sandbox Code Playgroud)

然而,这似乎是一种非常低效的方法,因为它意味着awk为每个变量调用一次.那么,有更好的方法吗?分隔符目前只是一个选项卡,但我可以将其更改为更容易使用的任何内容.

shell awk

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