Questions tagged «posix»

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


4
POSIX到底是什么?
我看到POSIX到处都在提到,并且我以它为UNIX的基本标准。.直到我在Wikipedia页面上注意到以下摘录:The Open Group 由The Open Group是最有名的认证机构为UNIX商标,其公布统一UNIX规范技术标准,它扩展了POSIX标准,是UNIX系统的官方定义。 如果UNIX系统的正式定义是POSIX的扩展,那么POSIX到底是什么?,,,当然,这似乎是UNIX世界的试金石,但我不知道它如何适合整体情况。
139 posix  standard 

5
“ foo(){}函数”和“ foo(){}”之间的区别
我可以bash使用或省略function关键字来定义函数。有什么区别吗? #!/bin/bash function foo() { echo "foo" } bar() { echo "bar" } foo bar 调用函数foo和bar成功都没有,我看不出有什么区别。所以我想知道这是否只是为了提高可读性,还是我缺少某些东西... BTW在其他shell中dash(例如/bin/sh,dash在debian / ubuntu中被符号链接)在使用function关键字时失败。
96 bash  shell  function  posix 

5
进度报告/记录信息是否属于stderr或stdout?
是否有正式的POSIX,GNU或其他指南,说明应在何处打印进度报告和日志记录信息(如“ Doing foo; foo done”之类的内容)?就个人而言,我倾向于将它们写入stderr,以便可以重定向stdout并仅获取程序的实际输出。最近有人告诉我,这不是一个好习惯,因为进度报告实际上不是错误,而应该仅将错误消息打印到stderr。 这两个职位都很有意义,当然您可以根据自己的工作细节选择一个或两个,但是我想知道是否有一个普遍接受的标准。在POSIX,GNU编码标准或任何其他这样的最佳实践列表中,我找不到任何特定的规则。 我们有一些类似的问题,但它们不能解决这个确切的问题: 何时在shell脚本中使用重定向到stderr:接受的答案表明了我倾向于做的事情,将程序的最终输出保留在stdout上,并保留给stderr。但是,尽管有论点支持,但这只是作为用户的意见而呈现的。 使用消息应该发送到stderr还是stdout?:这特定于帮助消息,但引用了GNU编码标准。这是我正在寻找的东西,不仅限于帮助消息。 那么,是否有关于打印进度报告和其他信息(不在程序实际输出中的部分)的官方规定?
75 posix  stdout  gnu  stderr  standard 

3
如何测试Shell脚本的POSIX兼容性?
考虑到POSIX是所有unice中最通用的标准,我很想知道是否有专门支持它的shell。尽管大多数现代Shell提供对POSIX的支持(并且可以毫无问题地运行POSIX兼容脚本),但它们在指出不兼容功能方面表现不佳。 是否有仅实现POSIX和POSIX的外壳,以至于它会为任何不兼容的功能抛出错误? 编辑我想澄清的是,我并不是在寻求有关编写可移植Shell脚本的一般提示。评论中提到的相关问题已经解决了这一问题。当我发现bash有一个--posix选择但只发现它只影响某些初始化行为时,我想到了这个问题,而这并不是我要寻找的。

3
cd外部命令的作用是什么?
正如这个好答案所提到的,POSIX系统cd除了内置shell 外还具有一个外部二进制文件。在OS X 10.8上为/usr/bin/cd。您不能像内置函数那样使用它,cd因为它会在更改其自己的工作目录后立即退出。它有什么作用?

5
/ dev / stdin,/ dev / stdout和/ dev / stderr的可移植性如何?
偶尔我需要指定一个“路径相当于”标准的IO流之一(的stdin,stdout,stderr)。由于我有99%的时间使用Linux,所以我只是假装/dev/get /dev/stdin等,这“ 似乎做对了”。但是,一方面,我一直对这样的理由感到不安(因为“当然,它似乎起作用”,直到不起作用为止)。此外,我对这种机动的便携性没有很好的认识。 所以我有几个问题: 在Linux中的情况下,它是安全(是/否)划上等号stdin, stdout以及stderr用/dev/stdin,/dev/stdout和 /dev/stderr? 更笼统地说,这种等效性“足够便携 ”吗? 我找不到任何POSIX参考。

1
“ rm。*”是否会删除父目录?
.*bash 将表达式扩展为包括当前目录和父目录: $ ls -la total 2600 drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 . drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 .. -rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo $ echo .* . .. 如果我rm -rf .*使用GNU bash在Debian上运行,version 4.2.36(1)-release并且rm从中rm (GNU coreutils) 8.13获得以下消息: $ rm -rf …
53 shell  wildcards  rm  posix 


1
何时以及如何在Unix / Linux中引入双破折号(-)作为选项定界符的结尾?
我不认为历史 Unix中的shell /实用程序或4.4BSD之类的 “最新”东西都不支持使用双破折号(或两个连续的连字符)作为选项定界符的结尾。使用FreeBSD,您可以看到例如在2.2.1发行版(1997)的rm 手册页中引入的注释。但这只是一个命令的文档。 查看我能找到的最旧的GNU fileutils 更改日志,我看到此1(稍作更改): Tue Aug 28 18:05:24 1990 David J. MacKenzie (djm at albert.ai.mit.edu) * touch.c (main): Don't interpret first non-option arg as a <--- time if `--' is given (POSIX-required kludge). * touch.c: Add long-named options. * Many files: Include <getopt.h> instead of "getopt.h" …
49 history  posix  gnu  arguments 

8
为什么POSIX强制性实用程序未内置在Shell中?
这个问题的目的是回答好奇心,而不是解决特定的计算问题。问题是:为什么POSIX强制实用程序通常不内置在Shell实现中? 例如,我有一个脚本,该脚本基本上读取一些小的文本文件并检查它们的格式是否正确,但是由于大量的字符串操作,在我的计算机上运行该脚本需要27秒。通过调用各种实用程序,此字符串操作使成千上万的新进程变慢了。我非常相信,如果一些工具,建于,即grep,sed,cut,tr,和expr,那么脚本会在第二或更小(根据我用C的经验)。 似乎在许多情况下,构建这些实用程序都会使Shell脚本中的解决方案是否具有可接受的性能产生差异。 显然,有一个选择不内置这些实用程序的原因。也许在系统级别使用一个实用程序版本可以避免各种外壳使用该实用程序的多个不相等版本。我真的想不出很多其他原因来保持创建这么多新流程的开销,并且POSIX对实用程序进行了足够的定义,只要它们各自是POSIX,那么使用不同的实现就似乎不是什么大问题符合。至少没有这么多流程的低效率那样大的问题。

7
test或[或[[在bash外壳之间和其他外壳之间都更容易移植吗?
我知道我能做 $ [ -w /home/durrantm ] && echo "writable" writable 要么 $ test -w /home/durrantm && echo "writable" writable 要么 $ [[ -w /home/durrantm ]] && echo "writable" writable 我喜欢使用第三种语法。它们在所有方面以及所有消极和极端情况下是否等效?在可移植性方面是否存在任何差异,例如在Ubuntu和OS X上的bash或较旧/较新的bash版本(例如4.0之前/之后)之间,它们是否都以相同的方式扩展表达式?

4
为什么UNIX / POSIX系统调用命名如此难以理解?
为什么使用诸如time和creat而不是getCurrentTimeSecsand createFile或者这样的非公开系统调用名,也许更适合Unix get_current_time_secs和create_file。这就引出了我的下一个要点:为什么有人想要cfsetospeed没有骆驼套的东西,或者至少要有下划线才能使之可读?当然,调用将包含更多字符,但是我们都知道代码的可读性更重要,对吗?

3
为什么某些应用程序将〜/ .config / appname用于其配置数据,而另一些应用程序则使用〜/ .appname?
我注意到有些应用程序将其配置文件放到~/.config/appname其他应用程序中~/.appname(经典方式为AFAIK)。这种区别的意义是什么?对于我的应用,有什么更好的考虑? 更新:看来我(默认为XUbuntu 11.10)将$ XDG_CONFIG_HOME设置为,~/并且系统中的大多数应用程序(例如Mozilla Firefox,Adobe Flash Player,Midnight Commander,Opera,Wine等)都符合此要求。但是仍然有许多应用程序代替使用(例如Compiz,Deadbeef,VLC,Qt Creator,Google Chrome,XFCE等)~/.config/。另一个可疑的事情是目录~/.config/本身不是隐藏的(名称中没有点)-难道应用程序配置目录不具有不依赖位置的恒定名称($ XDG_CONFIG_HOME值)吗?

7
Shebang中的多个论点
我想知道是否存在通过shebang行(#!)将多个选项传递给可执行文件的一般方法。 我使用NixOS,在我编写的任何脚本中,shebang的第一部分通常是/usr/bin/env。然后我遇到的问题是,系统将所有后续内容解释为单个文件或目录。 例如,假设我想编写一个bash在posix模式下执行的脚本。编写shebang的幼稚方式是: #!/usr/bin/env bash --posix 但是尝试执行生成的脚本会产生以下错误: /usr/bin/env: ‘bash --posix’: No such file or directory 我知道这篇文章,但我想知道是否有更通用,更清洁的解决方案。 编辑:我知道对于Guile脚本,有一种方法可以实现我想要的内容,在手册的4.3.4节中进行了介绍: #!/usr/bin/env sh exec guile -l fact -e '(@ (fac) main)' -s "$0" "$@" !# 这里的窍门是,第二行(以开头exec)被Guile解释器解释为代码,sh但在#!... !#块中但作为注释,因此被忽略。 不可能将这种方法推广到任何解释器吗? 第二次编辑:经过一番摸索之后,对于可以从中读取输入内容的解释器来说stdin,以下方法可行: #!/usr/bin/env sh sed '1,2d' "$0" | bash --verbose --posix /dev/stdin; exit; 但是,这可能不是最佳的,因为该sh过程一直持续到口译员完成工作为止。任何反馈或建议,将不胜感激。

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.