小编mic*_*ckp的帖子

对于有一行的文件,"$(cat file)","$(<file)"和"read ... <file"有什么区别?

我有一个只包含一行的输入文件:

$ cat input
foo bar
Run Code Online (Sandbox Code Playgroud)

我想在我的脚本中使用这一行,有三种方法可以让我知道:

line=$(cat input)
Run Code Online (Sandbox Code Playgroud)
line=$(<input)
Run Code Online (Sandbox Code Playgroud)
IFS= read -r line < input
Run Code Online (Sandbox Code Playgroud)

例如,使用命令替换意味着我会生成一个子shell,而read我不这样做,对吗?还有什么其他的差异,并且有一种方式优于其他方式?我也注意到(有strace)只是因为某种原因read触发了系统调用openat.其他人怎么可能不这样做?

$ strace ./script |& grep input
read(3, "#!/usr/bin/env bash\n\ncat > input"..., 80) = 80
read(255, "#!/usr/bin/env bash\n\ncat > input"..., 167) = 167
read(255, "\nline=$(cat input)\nline=$(<input"..., 167) = 60
read(255, "line=$(<input)\nIFS= read -r line"..., 167) = 41
read(255, "IFS= read -r line < input\n", 167) = 26
openat(AT_FDCWD, "input", O_RDONLY)     = 3
Run Code Online (Sandbox Code Playgroud)

bash file strace

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

为什么"$ <space> <tab> <tab>"执行文件名完成?

在尝试配置可编程完成时,我遇到了一个我不理解的行为.

鉴于这三种完成方案,这是我理解它们的方式:


$<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

行的开头 - >使用complete -E- >如果它不存在,使用complete -D- >如果它不存在,使用默认的Bash完成 - >行上没有单词 - >使用命令完成.


$com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

尝试完成第一个单词 - >使用命令完成.


$command argu<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

该行至少有一个单词 - >试图完成一个参数 - >使用complete给定的命令 - >如果它不存在,使用complete -D- >如果它不存在,使用默认的Bash完成 - >行上至少有一个单词,所以不要使用命令完成 - >不能启动$,~或者@执行文件名完成.


我的问题是为什么在这种情况下执行文件名完成而不是命令完成,即使该行上还没有单词:

$<SPACE><TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

由于下面的命令完成按预期执行,因此更加令人困惑:

$<SPACE>com<TAB><TAB>
Run Code Online (Sandbox Code Playgroud)

我很可能误解了手册,我会非常感谢任何解释.


注意: $表示提示,而不是文字美元符号.

bash tab-completion bash-completion

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

如何根据 ID 合并两个对象列表?

我有两个清单。第一个被调用oldList并包含旧数据,第二个被调用updateList并包含一组更新。

我想用这些规则创建一个新列表:

  • 将所有数据从 oldList
  • 用唯一的附加所有更新 id
  • 如果id中已存在更新的项目oldData,则替换它

我想出了一个简单的代码:

物品.kt

data class Item (val id: String, val text: String)
Run Code Online (Sandbox Code Playgroud)

主文件

fun main() {

    val oldList: List<Item> = listOf(
        Item("aaa1", "aaa2"),
        Item("bbb1", "bbb2"),
        Item("ddd1", "ddd2"))

    val updateList: List<Item> = listOf(
        Item("aaa1", "aaa3"),
        Item("ccc1", "ccc2"))

    val resultList = oldList.toMutableList()

    for (item in updateList) {
        val index = oldList.indexOfFirst { it.id == item.id }
        if (index < 0) {
            resultList.add(item)
        } else {
            resultList[index] = item …
Run Code Online (Sandbox Code Playgroud)

kotlin

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

如何使用 gradlew 列出所有构建变体?

是否可以使用gradlew其他命令行工具列出所有构建变体?

例如以下内容build.gradle

buildTypes {
    debug {}
    release {}
}
productFlavors {
    dev {}
    prod {}
}
Run Code Online (Sandbox Code Playgroud)

该命令将返回类似以下内容:

devDebug
devRelease
prodDebug
prodRelease
Run Code Online (Sandbox Code Playgroud)

一种选择是在 my 中创建一个 gradle 任务build.gradle,然后我将使用gradlew. 但我正在寻找一种适用于任何项目的通用解决方案,而无需添加任何内容。

android gradle build.gradle android-gradle-plugin

6
推荐指数
2
解决办法
2344
查看次数

获取数组的第一个索引

我有一个未从0索引的数组:

arr=([2]=aaa bbb ccc ddd)
Run Code Online (Sandbox Code Playgroud)

我需要得到数组的第一个索引.有很多事情我尝试过并且有效:

for index in "${!arr[@]}"; do
    first_index=$index
    break
done
Run Code Online (Sandbox Code Playgroud)
first_index=$(awk '{ print $1 }' <<< "${!arr[@]}")
Run Code Online (Sandbox Code Playgroud)
first_index=$(cut -d' ' -f1 <<< "${!arr[@]}")
Run Code Online (Sandbox Code Playgroud)
first_index=${!arr[@]}
first_index=${first_index%% *}
Run Code Online (Sandbox Code Playgroud)
ind=("${!arr[@]}")
first_index=${ind[@]:0:1}
Run Code Online (Sandbox Code Playgroud)

真正想要的是:

${!arr[@]:0:1}
Run Code Online (Sandbox Code Playgroud)

鉴于此语法对数组运行良好,${arr[@]:0:1}非常干净:

  1. 是否有类似的,更清晰的方法来做索引,没有外部工具,临时数组,临时变量,循环等?我的尝试似乎使这么简单的任务过于复杂
  2. 究竟发生了${!arr[@]:0:1}什么?

linux arrays bash

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

是否可以强制启用深色模式闪屏?

我正在实现黑暗模式,并且我有一个黑暗模式版本的启动画面drawable-night。然后在应用程序中onCreate我调用:

override fun onCreate() {
    super.onCreate()
    AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
Run Code Online (Sandbox Code Playgroud)

不过,似乎启动画面仍然遵循系统设置,而不是我设置的。我尝试在应用程序中执行相同的操作init,但产生了相同的结果。有没有办法做到这一点?

android kotlin android-darkmode

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

为什么带有不带引号的变量的glob会扩展到所有文件?

我有这个简短的片段:

#!/usr/bin/env bash

touch a_b c_d e_f

p=a

printf '%s\n' "Not quoted" ./$p_*
printf '%s\n' "" "Quoted" ./"$p"_*
Run Code Online (Sandbox Code Playgroud)

输出:

Not quoted
./a_b
./c_d
./e_f

Quoted
./a_b
Run Code Online (Sandbox Code Playgroud)

我很清楚分词和不引用变量的危险但我不明白为什么第一个带有未引用变量的glob $p扩展到所有文件.

bash

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

如何使用两个组合类提供接口实现?

我有以下接口和两个类:

interface A {
    fun foo()
    fun bar()
}

class B {
    fun foo() {}
}

class C {
    fun bar() {}
}
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式使用/组合这两个类来为此接口提供实现?

kotlin

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

如何一次迭代列出两个项目?

是否有一些不错的 Kotlin 习惯用法可以一次有效地迭代一个列表中的两个项目?

就像是:

val items = listOf("one", "two", "three", "four")

items.forEach(2) { item1, item2 ->
   println("$item1 and $item2")    
}
Run Code Online (Sandbox Code Playgroud)

输出将是:

one and two
three and four
Run Code Online (Sandbox Code Playgroud)

kotlin

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