标签: posix

chown(1) POSIX 规范的解释

chown实用程序的 POSIX 规范在其基本原理部分中提到了有关chown user:group语法(以前的chown user.group)(强调我的):

POSIX.1-2008 的这一卷中包含了 4.3 BSD 指定所有者和组的方法,因为:

  • 在某些情况下,使用 chgrp 和 chown(仅更改用户 ID)实用程序无法实现所需的结束条件。(如果当前所有者不是所需组的成员,并且所需所有者不是当前组的成员,则除非所有者和组同时更改,否则 chown() 函数可能会失败。)

我认为user:group语法是一个方便的东西。现在,上述暗示有事情可以做chown user:group,你不能用chgrp group; chown user

现在那个文本对我来说没有意义。在 4.3BSD 中,只有 root 可以更改文件的所有者,因此在任何情况下他都可以做什么没有限制。

SysV 和其他一些系统允许(或曾经允许)文件的所有者将文件的用户和组更改为任何内容,但即使在这些系统中,上面的文本对我来说也没有意义。好的,如果有人做了 a chown someone-else the-filechgrp something-else the-file之后就不能再做,因为他不再是文件的所有者,但是没有什么可以阻止他/她做第chgrp一个(保持文件的所有者)和chown之后的事情,这不是上面的文字正是说。

我不明白什么和所需的所有者不是当前组的成员与问题有什么关系。

那么在什么情况下chown() 函数可能会失败,除非所有者和组同时更改,以及在什么系统上?

posix chown

19
推荐指数
2
解决办法
1955
查看次数

在符合 POSIX 的 shell 中询问密码?

当我想在bash脚本中要求输入密码时,我会这样做:

read -s
Run Code Online (Sandbox Code Playgroud)

...但是当我bash在 POSIX 模式下运行时sh,该-s选项被拒绝:

$ read -s
sh: 1: read: Illegal option -s
Run Code Online (Sandbox Code Playgroud)

如何使用符合 POSIX 的命令安全地请求输入?

shell scripting password posix

19
推荐指数
2
解决办法
3054
查看次数

GNU 超时的 POSIX 等价物?

GNU 核心工具 timeout命令对于某些脚本情况非常方便,如果运行速度很快,则允许使用命令的输出,如果运行时间过长,则可以跳过它。

如何近似timeout仅使用 POSIX 指定实用程序的基本行为?


(我认为它可能涉及,和的组合wait,谁知道还有什么,但也许我错过了一种更简单的方法。)sleepkill

shell-script posix timeout

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

如何在 POSIX shell 脚本中创建算术循环?

我知道如何forbash.

如何在 POSIX shell 脚本中执行等效循环?

由于有多种方法可以实现同一目标,请随意添加您自己的答案并详细说明其工作原理。

一个这样的bash循环的例子如下:

#!/bin/bash
for (( i=1; i != 10; i++ ))
do
    echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

shell-script posix bourne-shell

19
推荐指数
2
解决办法
7692
查看次数

如何有条件地从 POSIX shell 脚本传递参数?

#!/bin/sh
echo "Noise $1"
echo "Enhancement $2"
for snr in 0 5 10 15 20 25
do
  python evaluate.py --noise $1 --snr 25 --iterations 1250 --enhancement $2
done
Run Code Online (Sandbox Code Playgroud)

如果$2未指定,我不想将--enhancement $2参数传递给我的 python 脚本。我该怎么做?

shell-script posix arguments

19
推荐指数
2
解决办法
2361
查看次数

在哪里可以找到官方的 POSIX 和 UNIX 文档?

我正在寻找有关所有 POSIX 标准和规范的官方文档。我希望无法阅读文档以更好地了解 UNIX 系统以及它们如何在低级别工作。我在这里和那里都看到了 opengroup.org 的链接,我假设它是标准背后的实体(但是,我也听说 IEEE 也提到了很多)。

要详细了解 POSIX,请参阅以下问题:POSIX 究竟是什么?它为我解答了很多问题。

documentation standard posix

18
推荐指数
2
解决办法
5022
查看次数

使用 #!/bin/sh 或 #!/bin/bash 以获得 Ubuntu-OSX 兼容性和易用性和 POSIX

我知道我可以使用任一脚本作为调用所需 shell 的第一行。

#!/bin/sh如果与所有 unix 系统的兼容性是绝对要求,会推荐吗?

就我而言,我唯一关心的操作系统是 Ubuntu (Debian) 和 OSX。鉴于此,我可以使用#!/bin/bash并确保它可以在两个系统上运行吗?
这是否也可以更轻松地使用具有更现代和更清晰的命令语法的脚本?使用是否#!/bin/sh也与使用 POSIX 有关?

osx shell bash ubuntu posix

18
推荐指数
3
解决办法
2万
查看次数

确定当前 shell 的符合 checkbashisms 的方法

在我的 中.profile,我使用以下代码来确保仅当登录 shell 实际上是 Bash时才提供与 Bash 相关的别名和函数:

# If the current (login) shell is Bash, then
if [ "${BASH_VERSION:-}" ]; then
  # source ~/.bashrc if it exists.
  if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
  fi
fi
Run Code Online (Sandbox Code Playgroud)

我目前正在将我的 shell 配置文件、脚本和函数置于版本控制之下。我最近还开始了从 shell 脚本中删除随意的 Bashisms 的过程,这些脚本不能从 Bash 特定的功能中受益,例如,替换function funcname()funcname().

对于我的 shell 文件存储库,我配置了一个预提交钩子,它在存储库中的每个文件上运行checkbashisms来自 Debian 的devscripts 包的实用程序,sh以确保我不会无意中引入 Bash 特定的语法。但是,这会引发我的错误.profile

possible bashism in .profile line 51 ($BASH_SOMETHING): …
Run Code Online (Sandbox Code Playgroud)

bash shell-script posix portability

18
推荐指数
3
解决办法
1645
查看次数

为什么 POSIX 未指定 `#!` 语法的行为?

从POSIX 规范的Shell 命令语言页面:

如果 shell 命令文件的第一行以字符“#!”开头,则结果未指定。

为什么#!POSIX 未指定的行为?我觉得令人困惑的是,如此便携和广泛使用的东西会有未指明的行为。

shell posix shebang

18
推荐指数
2
解决办法
2490
查看次数

为什么 POSIX 中没有 mktemp 命令?

shell 脚本需要做的最常见的事情之一是创建和操作临时文件。这样做安全是一种痛苦,因为你需要避免名称冲突,避免竞争条件,确保该文件具有正确的权限,等等(参见GNU Coreutils的手册琐碎的博客文章这方面的迹象对这些更详细的讨论问题。)大多数类 Unix 操作系统通过提供mktemp处理所有这些问题的命令来解决这个问题。但是,这些mktemp命令的语法和语义没有标准化。如果您真的想安全可移植地创建临时文件,则必须求助于丑陋的杂物,例如以下内容:

tmpfile=$(
  echo 'mkstemp(template)' |
    m4 -D template="${TMPDIR:-/tmp}/baseXXXXXX"
) || exit
Run Code Online (Sandbox Code Playgroud)

(此变通方法利用了宏处理器m4是 POSIX 的一部分这一事实,并m4公开了mkstemp()同样由 ​​POSIX 定义的 C 标准库函数。)

鉴于这一切,为什么 POSIX 没有标准化一个mktemp命令,保证它的存在和至少它行为的某些方面?这是 POSIX 委员会的一个明显疏忽,还是委员会mktemp实际上已经讨论了标准化的想法并因某些技术或其他原因被拒绝?

shell-script posix mktemp

18
推荐指数
2
解决办法
1320
查看次数