Questions tagged «posix»

POSIX是可移植操作系统接口(Portable Operating System Interface)的缩写,可移植操作系统接口是IEEE为维护操作系统之间的兼容性而指定的一系列标准。

2
分配类似于具有退出状态的命令,除了何时有命令替换?
请参阅以下示例及其在POSIX Shell中的输出: false;echo $?或false || echo 1:1 false;foo="bar";echo $?或foo="bar" && echo 0:0 foo=$(false);echo $?或foo=$(false) || echo 1:1 foo=$(true);echo $?或foo=$(true) && echo 0:0 正如在/programming/6834487/what-is-the-variable-in-shell-scripting中投票最高的答案所提到的: $? 用于查找最后执行的命令的返回值。 在这种情况下,这可能有点误导,因此让我们获取POSIX定义,该定义也在该线程的帖子中被引用: ?扩展到最新管道的小数退出状态(请参见管道)。 因此,它仿佛是一次分配本身算作一个命令(或者说管道部分)以零退出值,但其应用之前分配的右侧(例如,在我的例子命令替换调用这里)。 我从实际的角度看这种行为是有道理的,但对我而言,分配本身按该顺序进行计数似乎有点不寻常。也许要弄清楚为什么对我来说很奇怪,让我们假设赋值是一个函数: ASSIGNMENT( VARIABLE, VALUE ) 那foo="bar"会是 ASSIGNMENT( "foo", "bar" ) 并且foo=$(false)会像 ASSIGNMENT( "foo", EXECUTE( "false" ) ) 这意味着先EXECUTE运行,然后才运行,但这仍然是重要的状态。 ASSIGNMENTEXECUTE 我的评估是否正确,或者我误会/遗漏了什么?这些是我将这种行为视为“奇怪”的正确原因吗?

2
如何将所有输出发送到POSIX Shell中的`logger`?
我想在.xprofile使用中分别记录标准输出和标准错误logger。在Bash中,我认为这看起来像这样: exec 1> >(logger --priority user.notice --tag $(basename $0)) \ 2> >(logger --priority user.error --tag $(basename $0)) 我将如何以POSIX /bin/sh兼容的方式进行操作?
10 shell  pipe  posix 


2
条件表达式中“ set -e”下“ eval”的行为
考虑命令 eval false || echo ok echo also ok 通常,我们希望它能够执行该false实用程序,并且由于退出状态为非零,因此可以执行echo ok和echo also ok。 在所有的类POSIX我用贝壳(ksh93,zsh,bash,dash,OpenBSD的ksh,和yash),这是发生了什么,但事情变得有趣的,如果我们能set -e。 如果set -e有效,则执行时,OpenBSD sh和kshshell(均从派生pdksh)将终止脚本eval。没有其他外壳可以做到这一点。 POSIX说特殊的内置实用程序(例如eval)中的错误应导致非交互式外壳终止。我不确定执行是否false构成“错误”(如果确实如此,它将独立于set -e活动状态)。 解决此问题的方法似乎是将evalin 放在子shell中, ( eval false ) || echo ok echo also ok 问题是,是否应该在POSIX正确的shell脚本中执行此操作,还是在OpenBSD的shell中出现错误?另外,上面链接到的POSIX文本中的“错误”是什么意思? 额外的信息:OpenBSD Shell将 在命令中echo ok使用和不使用两者set -e eval ! true || echo ok 我的原始代码看起来像 set -e if eval "$string"; …
10 posix  openbsd  eval 

2
括号命令组为什么在POSIX Shell语法中的左括号之后需要空格?
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;}不起作用。 当然,保留字被视为空壳字会有意义,之后需要一个空格以与字段拆分的概念保持一致,但是定义本身并未提及空格。此外,如果POSIX的复合命令定义都将{和(都视为保留字,那么为什么在这些保留字之后的空格字符方面会有不同的对待?现在,ksh(1)手册确实指出: 单词是字符序列,由无引号的空格字符(空格,制表符和换行符)或元字符(<,>,|,;,&,(和))定界 换句话说,有意义的是ksh将被识别(为单词定界符,其中第一个单词将是命令或变量赋值。POSIX,但是似乎没有提到(元字符。就POSIX语法而言,我发现的唯一可能的解释是{被认为是“令牌”,此处(未列出为一个。 /* These are reserved words, not operator tokens, and are recognized when reserved words …
10 shell  posix  subshell  syntax 

1
\ time,t / ime和cd实际做什么?(在外壳中加反斜杠的乐趣)
在讨论/usr/bin/time与内置shell(bash和zsh)之间的区别时time,有人提到一个人可以\time用作get的简写/usr/bin/time。 首先,它似乎是一个不错的无害捷径,但随后出现了一些问题: 为什么也可以t\ime工作? 为什么\cd即使/usr/bin/cd¹都没有更改目录? 显然,\foo这不等于$(which foo)。现在的问题是: \fooshell的POSIX定义是否以任何方式涵盖了bash和zsh中观察到的行为?如果是,为什么它表现得如此? 脚注1:/usr/bin/cd在我的系统上, #!/bin/sh builtin cd "$@"

2
获取`posix_spawn`的输出
因此,我可以使用POSIX在Unix / Linux中运行进程,但是有什么方法可以将进程的STDOUT和STDERR都存储/重定向到文件?该spawn.h头包含减速posix_spawn_file_actions_adddup2看起来相关,但我不知道怎么和使用它。 该过程产生: posix_spawn(&processID, (char *)"myprocess", NULL, NULL, args, environ); 输出存储: ...?
9 c  posix  fork 

2
POSIX测试和-a
我使用checkbashisms检查了我的脚本,并收到以下警告: possible bashism in check_ssl_cert line 821 (test -a/-o): if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then 在POSIX规范的4.62.4节中,我发现 primary -a primary对binary和primary的结果执行二进制运算。-a运算符优先于-o运算符。 为什么-a和-o被认为是不可携带的?

1
为什么撤销POSIX.1e?
提议的POSIX.1e标准定义了一些诸如ACL之类的东西,这些东西得到了广泛的支持。但是提案本身被撤回了。怎么来的?我在网上找到的唯一理由是来自http://wt.tuxomania.net/topics/1999_06_Posix_1e/的引用: 从今天(2014年7月)的角度很难理解为什么废弃Posix.1e。Solaris,Irix,Linux和其他Unices似乎都认可该标准。另一方面,FreeBSD项目发现了反论点,并且默认情况下未集成功能(“细粒度特权”)。 另一方面,JörgSchilling在此站点上表示了这一点(文件系统ACL中“ mask”的确切目的是什么?) 顺便说一句:参考实现(ag Solaris)在1997年撤消了ACL的POSIX-1003.1草案,因为事实证明,客户需要一种更强大的方法,该方法后来被标准化为NVSv4 ACL。 是否更详细地说明了发生了什么?
9 posix  history  acl 

2
需要如何在POSIX Shell中重复字符的说明
关于堆栈溢出的以下答案, 如何在bash中重复一个字符? 强制采用一种可能的POSIX方式- 重复单个字符,如下所示。在此示例中,我们使用等号100次: printf %100s | tr " " "=" 我的问题是我不了解它是如何工作的,我希望使用简单的解释。请不要像阅读本手册那样发表评论,因为这样做不是很聪明,所以我问这个问题是因为我从未使用过tr,也从未见过这样的printf声明。
8 shell  posix  printf  tr 

2
测试变量是否包含换行符(POSIX)
我知道有些外壳接受这种测试: t() { [[ $var == *$'\n'* ]] && res=yes || res=no printf '%s ' "$res"; } var='ab cd' t var='abcd' t echo 执行时: $ bash ./script yes no 什么是POSIX(破折号)工作等效项 以下是可靠的测试方法吗? nl=' ' t() { case "$var" in *$nl* ) res=yes ;; * ) res=no ;; esac printf '%s ' …

2
如何获取特定文件的文件系统信息?
找出有关文件的文件系统信息的最佳方法是什么。 例如,如果我有一个文件 /media/xyz/path/to/file.ext 并且/etc/fstab包含 //server1/Share1 /media/xyz cifs option1=value1,... 如何确定文件在Samba共享上,是否具有本地路径/path/to/file.ext以及文件系统的挂载选项? 正在解析mount便携式解决方案的输出吗?还是解析findmnt?是否有符合POSIX的方法来实现?
8 mount  posix 

2
变量分配影响当前正在运行的外壳
在编写一些代码时,我发现这一行: $ TZ="America/Los_Angeles" date; echo "$TZ" Thu Dec 24 14:39:15 PST 2015 正确给出“洛杉矶”的实际时间,并且TZ不保留变量的值。一切都应该预期。 但是,使用此行(我以前用来扩展某些格式,并且基本上执行相同的操作)保留了TZ的值: TZ="America/Los_Angeles" eval date; echo "$TZ" Thu Dec 24 14:41:34 PST 2015 America/Los_Angeles 经过多次测试后,我发现这仅在某些shell中发生。它发生在破折号,ksh中,但不发生在bash或zsh中。 Q的 问题是: 为什么现在的外壳中保留TZ的值? 如何避免/控制这种情况(如果可能)? 额外。 我使用以下两行在几个shell中运行测试: myTZ="America/Los_Angeles" unset TZ; { TZ="$myTZ" date; } >/dev/null; echo -n " direct $TZ" unset TZ; { TZ="$myTZ" …

1
最小的POSIX兼容操作系统
出于教育目的,我想从POSIX兼容基础开始,包括外壳,基本实用程序和ANSI C编译器,然后看看可以通过将软件包放在一起来构建什么样的环境。 但是,我遇到的大多数最小的符合POSIX的操作系统似乎都是嵌入式和/或专有的。我可以在Virtualbox上轻松运行这些开源系统吗? 我搜索了一些有关从头开始构建这样的环境的信息,但是要获得一个可启动/可用的环境似乎要花很多功夫,而与POSIX兼容的环境要少得多。某天我可能会尝试构建POSIX OS,但首先我想先变得更精通计算机。 注意: 我想我曾经听说过Linux并不完全符合POSIX,但是只要我可以编译并构建一些更常见和必不可少的开源工具(例如wget和w3m),无论是否愿意,我都会很高兴使用了Linux内核。我想可能会随操作系统一起提供的其他基本组件也是如此(例如glibc)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.