AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-85039

Sergiy Kolodyazhnyy's questions

Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-06-25 01:10:32 +0800 CST

为什么大括号命令组在 POSIX Shell 语法中的左大括号后需要空格?

  • 12

TL;DR:为什么 POSIX 大括号组在{保留字后需要空格,而 subshel​​l 在保留字后不需要空格(?

POSIX shell 语法定义大括号组和子shell 如下

brace_group      : Lbrace compound_list Rbrace

subshell         : '(' compound_list ')'

现在,如果我们从字面上理解,空格很重要。这意味着必须有空格来描述左大括号和圆括号,如

{ echo hello world; }

( echo hello world )

这也将与复合命令定义保持一致:

这些复合命令中的每一个在开头都有一个保留字或控制运算符,在末尾有一个相应的终止符保留字或运算符。

然而,没有意义的是为什么(list)并且( list )工作得很好((不需要后面的空格),但是大括号扩展必须有一个前导空格,即{echo hello;}不起作用。

当然,保留字被视为 shell 字之后需要一个空格以与字段拆分的概念保持一致是有意义的,但是定义本身并没有提及空格。此外,如果{和(都被复合命令的 POSIX 定义视为保留字,为什么在这些保留字之后的空格字符方面对它们进行不同的处理?现在,ksh(1)手册确实说明了:

单词是字符序列,由不带引号的空白字符(空格、制表符和换行符)或元字符(<、>、|、;、&、(和))分隔

换句话说,ksh 将识别(为单词分隔符是有意义的,其中第一个单词将是命令或变量赋值。然而,POSIX 似乎没有提到(元字符。就 POSIX 语法而言,我发现的唯一可能的解释是它{被认为是一个“令牌”,其中 as(没有被列为一个。

/* These are reserved words, not operator tokens, and are
   recognized when reserved words are recognized. */


%token  Lbrace    Rbrace    Bang
/*      '{'       '}'       '!'   */

那么这种差异的确切原因是什么?

接受的答案说明:

  • 将接受的复选标记移至Isaac 的答案,因为它提供了标准本身的报价,直接解决了我的问题:

    例如,'(' 和 ')' 是控制运算符,因此<space>(list) 中不需要。但是,'{' 和 '}' 是 {list;} 中的保留字,因此在这种情况下,前导<space>和<semicolon>是必需的。

  • 接受 Kusalananda 的回答。Kusalananda 的回答解决了我的需要,尽管主要是从非正式和直观的角度来看;它指出{是保留字并且(是运算符。Michael Homer 在评论中也提到了同样的内容——复合命令定义声明(强调添加):

    这些复合命令中的每一个在开头都有一个保留字或控制运算符

  • {被定义为保留字,类似于foror while,列在 Shell Grammar 中(参见问题中的最后一个代码块)

  • 第 2.9 节指出(已添加重点):

    特别是,这些表示包括在不需要 s的某些地方的标记之间的间距<blank>(当其中一个标记是运算符时)。

  • 虽然标准没有明确定义(为运算符,但(称为运算符;具体来说,第 2.9.2 节说

    如果管道以保留字开头!并且 command1 是子 shell 命令,应用程序应确保 command1 开头的 ( 运算符与 ! 分隔一个或多个字符。保留字 ! 的行为紧跟 ( 运算符是未指定的。

  • Digital Trauma关于 Stack Overflow的问题指出了关于保留字的第 2.4 节:

    只有在没有引用任何字符并且该词被用作以下情况时,才会发生这种识别:

    - 命令的第一个字

  • 正如 Kusalananda 的回答“POSIX 语法中显示的空格不是 shell 输入数据中需要存在的空格,而只是显示语法本身的一种方式。事实上,大括号是保留字,这意味着它们必须被空格包围”正如迈克尔荷马在评论中提到的那样:“如果空格本身很重要,则需要在生产中列出它们”

结案。

shell posix
  • 2 个回答
  • 1027 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-02-13 23:21:33 +0800 CST

为什么 ${$#} 在 shell 中返回与 $$ 相同的结果?

  • 18

在尝试获取最后一个位置参数集时/bin/dash,我试过了echo ${$#}。令人惊讶的是,这并没有导致错误,而是进入与$$变量内容相同的 PID。问题,为什么该语法有效?shell 在这里应用的语法规则是什么?

基本上,我所做的是

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

显然,%在这种结构中,字符也会被忽略

$ echo ${$%}
13819

但是*并@导致错误的替换错误:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution
shell variable
  • 1 个回答
  • 1291 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-01-18 14:11:23 +0800 CST

为什么删除条目后具有大量条目的目录不会缩小大小?

  • 14

关闭投票通知:虽然链接的副本提出了相同的问题,但评论和唯一答案并未提供来自权威来源的答案。Thomas Dickey 对我的问题的回答实际上提供了我一直在寻找的答案。因此,建议的副本没有帮助,但是托马斯在这里的回答是正确的。

根据G-Man在此 PerlDuck 的评论中对超级用户问题和个人帐户的回答,具有大量条目的目录的大小超过 4096 字节(可以在输出中看到),但是一旦删除了条目 -数字永远不会下降。ls -l

问题是“为什么”?是否由于ext4文件系统配置为保留目录元数据?显然删除目录并重新创建它不是一个解决方案,因为它会删除原始 inode 并创建一个新的。可以做些什么来手动减少数字?

directory ext4
  • 1 个回答
  • 1670 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-01-17 03:37:10 +0800 CST

POSIX 是否保证某些用户名?

  • 0

在 POSIX 定义中有特定的第 3.424 节,用户数据库,它定义了应该与每个用户 ID 相关的信息。但是,在整个文档中,我找不到(至少不是通过简单的Ctrl+f搜索)提到任何一个root或任何典型的系统用户名,例如syslog, bin, daemon, nobody, sys。在 3.424 所指的newgrp 实用程序定义中似乎也没有提到这些。

这就引出了一个问题:POSIX 是否需要存在某些系统级用户名或 UID?用户是否root甚至需要root,或者理论上是否有可能拥有不调用最强大的系统帐户root或具有非零 UID 的符合 POSIX 的系统?

users posix
  • 1 个回答
  • 293 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2019-01-10 20:30:52 +0800 CST

bash coprocess 如何实现其流水线化?

  • 0

请注意man bash中的这段话(强调我的):

协同进程

协进程是前面带有 coproc 保留字的 shell 命令。协进程在子 shell 中异步执行,就好像命令已用 & 控制运算符终止, 在执行 shell 和协进程之间建立了双向管道。

现在,正如我们所知,与其他 *nix 系统不同,Linux 管道是单向的(还有参考man pipe(7),可移植性部分)。那么 bash coproces 如何在 Linux 上不存在的情况下实现“双向管道”?

bash pipe
  • 1 个回答
  • 299 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-11-15 01:20:34 +0800 CST

df无法识别正在调整大小的分区?[复制]

  • 13
这个问题在这里已经有了答案:
如何调整它们上的分区和文件系统的大小? (1 个回答)
更改 linux 的分区 1 个回答
3年前关闭。

我在 Virtual Box 中有 Ubuntu 18.04 服务器,一旦我在虚拟磁盘上用完了 10 GB 的分配空间,我就将虚拟磁盘的大小增加到 17 GB,并使用 命令调整根分区parted的大小resizepart(并且在使用分区时这样做,是的,我知道这是不好的做法,但它是一个用于开发的虚拟机,所有代码都提交给 github,我有一个机器的克隆以防万一)。

一切似乎都奏效了:lsblk并udisksctl正确报告了新大小,但df仍停留在报告旧的 10 GB 和 100% 使用率(即使在重新启动后)。为什么会这样?我能对这种奇怪df的行为做些什么?

ubuntu virtualbox
  • 1 个回答
  • 14738 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-09-21 23:09:21 +0800 CST

如何创建公共 unix 域套接字?

  • 3

考虑/var/run/acpid.socket。在任何时候,我都可以连接到它并从中断开连接。将其与nc:

$ nc -l -U ./myunixsocket.sock
Ncat: bind to ./myunixsocket.sock: Address already in use. QUITTING.

nc显然只允许一次性使用的套接字。那么问题是,我如何创建一个类似于 的套接字以/var/run/acpid.socket供多次使用和重用?

unix-sockets nc
  • 1 个回答
  • 8538 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-09-11 12:45:53 +0800 CST

如何拦截程序创建的临时文件?[复制]

  • 3
这个问题在这里已经有了答案:
创建后如何直接访问临时文件? (4 个回答)
4年前关闭。

TL;DR:我知道一个程序创建然后删除/tmp. 我怎样才能拦截他们进行检查?

上下文:

.jar有一个我不信任的特定文件;出于某种原因,它的源代码包含一个 ftm 方法并具有建立连接的能力,这从输出中与网络相关的系统调用中可以明显看出strace(当我指的是连接时,我不是指 unix 域套接字,它是AF_INET6)。我使用 Wireshark 进行了检查,发现在使用过程中没有传出 TCP 或 UDP 连接。

但是,我仍然不太相信它。从我的输出中strace我看到它正在创建临时文件,/tmp然后将它们删除。有没有办法拦截这些文件来检查它们的内容?

security files
  • 2 个回答
  • 1129 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-09-03 22:00:45 +0800 CST

为什么在简单的 bash 命令中没有明显的克隆或分叉以及它是如何完成的?

  • 8

考虑以下(sh存在/bin/dash):

$ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcc8b661810) = 24865
wait4(-1, /proc/self/status:Pid:    24865
/proc/24864/status:Pid: 24864
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24865
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24865, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++

没有什么不寻常的,从主 shell 进程中grep替换了一个分叉的进程(这里通过 完成)。clone()到目前为止,一切都很好。

现在使用 bash 4.4:

$ strace -e trace=process bash -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/bash", ["bash", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f8416b88740) = 0
execve("/bin/grep", ["grep", "^Pid:", "/proc/self/status", "/proc/25798/status"], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7f8113358b80) = 0
/proc/self/status:Pid:  25798
/proc/25798/status:Pid: 25798
exit_group(0)                           = ?
+++ exited with 0 +++

这里很明显的是grep假设 shell 进程的 pid 并且没有明显fork()或clone()调用。那么,问题是,如何在bash没有任何一个调用的情况下实现这样的杂技呢?

但是请注意,clone()如果命令包含 shell 重定向,则会出现系统调用,例如df > /dev/null

shell strace
  • 2 个回答
  • 2615 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-08-20 15:31:47 +0800 CST

“ls -l /proc/[PID]/fd”的输出中的 anon_inode 是什么?

  • 11

在浏览/proc/[PID]/fd/各种进程的文件夹时,我发现了奇怪的条目dbus

lrwx------ 1 root root 64 Aug 20 05:46 4 -> anon_inode:[eventpoll]

因此问题是,什么是anon_inodes ?这些类似于匿名管道吗?

linux proc
  • 2 个回答
  • 12911 Views
Martin Hope
Sergiy Kolodyazhnyy
Asked: 2018-06-24 09:43:23 +0800 CST

如何导致“参数列表太长”错误?[复制]

  • 14
这个问题在这里已经有了答案:
什么定义了命令单个参数的最大大小? (3 个回答)
4年前关闭。

问题的上下文:根据POSIX 规范,ARG_MAX 是函数族的命令行参数的最大长度。exec()这让我相信这是参数的实际数量,但这显然不起作用:

$ ulimit -s
8192
$ touch {1..18000}.jpg
$ rm *.jpg
$ 

显然,这很好用,尽管长度超过 8192 项。根据DW 的回答,8192应该是 kB 的大小。很明显,之前的假设是错误的。

这就是实际问题出现的地方:我如何计算实际将超过 8192 kB 限制的项目数量?换句话说,我必须执行什么样的计算来确保这种*.jpg类型的 glob 会导致Argument list too long错误?

请注意,这不是What defined the maximum size of single command argument的副本。我知道getconf ARG_MAX和ulimit -s价值观,这不是我的问题。我需要知道如何生成足够多的大小参数以超过限制。换句话说,我需要找到一种方法来获取错误,而不是避免它。

shell command-line
  • 4 个回答
  • 16311 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve