【问题标题】:what does \! mean? find . \! -user redis -exec chown redis '{}' +\! 是什么意思?意思是?找 。 \! -user redis -exec chown redis '{}' +
【发布时间】:2019-03-13 06:13:53
【问题描述】:

关于redis docker镜像ENTRYPOINT脚本docker-entrypoint.sh

#!/bin/sh
set -e

# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
        set -- redis-server "$@"
fi

# allow the container to be started with `--user`
if [ "$1" = 'redis-server' -a "$(id -u)" = '0' ]; then
        find . \! -user redis -exec chown redis '{}' +
        exec gosu redis "$0" "$@"
fi

exec "$@"

在下面一行:

find . \! -user redis -exec chown redis '{}' +

\! 是什么意思?

【问题讨论】:

  • ! 表示not,因此该命令应该找到(然后是chown用户“redis”拥有的项目。但是一个普通的! 对shell(命令行处理器)有特殊的含义,所以! 必须以防止这种特殊处理的方式编写。在 ! 之前放置一个反斜杠。这就是为什么它在该命令中写为\!
  • 非常感谢ottomeister。

标签: docker shell find sh


【解决方案1】:

根据GNU find documentation,您可以同时使用! <expr>-not <expr> 来匹配不匹配表达式的项目:

2.11 将基本元素与运算符组合

表达式
-not 表达式

如果 expr 为假则为真。在某些 shell 中,有必要通过引用来保护“!”免受 shell 解释。

反斜杠 (\) 用于多个 shell,例如 Bourne-Again Shell (bash) 到具有特殊含义的 escape reserved characters exclamation mark (!) 字符。

在这种情况下,正如@ottomeister 在他的评论中已经提到的那样,这个命令将对从当前目录递归找到的所有项目应用chown redis <item>,其所有者还不是redis。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多