我有以下代码,它是source我的-d.shellrc
PATH="${PATH}:${HOME}/perl5/bin"
PATH="${PATH}:${HOME}/.bin"
export PATH
Run Code Online (Sandbox Code Playgroud)
但是,如果我更改其他代码然后更改source此文件,则每个源的路径都会越来越长,每次都在它们已经存在时追加。我能做些什么来防止这种情况?
我知道什么是ugoa(所有者、组、其他人、全部)或rwx(读取/正确/执行)或 4,2,1 或-, f, d, l,我试图读入man chmod以了解什么是大写X,chmod但没有一个条目。然后我在 posix/chmod 中阅读了这篇文章,但被困在了这段话中:
仅当目标 a) 是目录 b) 已经为用户、组或其他人中的任何一个设置了至少一个可执行位时才设置可执行位。
我还在这篇文章中读到了这个代码示例:
chmod -R u=rwX,g=rX,o=rX testdir/
Run Code Online (Sandbox Code Playgroud)
我知道testdir/对所有者 (u)、组 (g) 和其他人 (o)有递归许可,但我承认我仍然错过了大写 X 的意图。
也许这里的教学措辞可以对此有所了解(我在这里发布的主要原因是因为我没有找到关于此的 SE 会议)。
更新
对不起,我错过了那个男人。我没想到 X 会出现在参数列表之前,我认为搜索返回的是 x 而不是 X,我的错。
我最近注意到POSIX 规范find不包括-maxdepth主要的。
对于不熟悉的人来说,-maxdepth初级的目的是限制find下降的深度。 -maxdepth 0结果只处理命令行参数;-maxdepth 1只会直接在命令行参数等中处理结果。
如何-maxdepth仅使用 POSIX 指定的选项和工具获得与非 POSIX主节点等效的行为?
(注意:当然我可以-maxdepth 0通过仅用-prune作第一个操作数来获得等价物,但这不会扩展到其他深度。)
寻找我可以对此问题提出的建议/编辑以重新打开它。其中很多答案对我来说似乎都是客观的,它们正是我正在寻找的答案类型。
我读过四篇有关 POSIX 的文章,但未能找到答案。现在我知道 POSIX是什么,我已经知道标准是什么,但我仍然不确定为什么 POSIX 标准今天仍然具有相关性。我读过的三篇文章之一是对理查德·斯托曼的采访。在其中,他说
Seth:符合 POSIX 标准的自由软件项目是否更容易移植到其他类 Unix 系统?
RMS:我想是这样,但我在 20 世纪 80 年代决定不花时间将软件移植到 GNU 以外的系统上。...
Seth:POSIX 对软件自由重要吗?
RMS:从根本上来说,这没有什么区别。然而,标准化……帮助我们更快地迈向……自由软件。这是在 20 世纪 90 年代初实现的……[强调我的]
他的答案带有 GNU 观点的色彩,但他似乎是在回答我的问题,“POSIX 不再相关”?
这里有一些更具体的内容来解释为什么我首先对此感兴趣:在这个答案中,我建议使用进程重定向<(command)。回复称:“不幸的是,进程重定向是一项非 POSIX 功能,因此并非所有机器都支持它。”
我想我假设脚本以#!/bin/bash. 既然进程重定向是 bash 的一项功能,那么这是否意味着任何带有 bash 的系统都是可移植的?根据维基百科的说法,bash“已被用作大多数 Linux 发行版的默认登录 shell”。
然而,本文称,“目前,除了两个商业 Linux 发行版浪潮 K-UX [12] 和华为 EulerOS [6] 之外,由于成本高昂,Linux 尚未获得 POSIX 认证。相反,Linux 被视为主要是符合 POSIX 标准。”
所以,我认为POSIX …
我正在尝试编写我所有的sh启动/环境脚本,以尽可能多地使用DRY:“适用于我将其克隆到的每个 *nix”。这意味着确保如果我尝试运行不存在的代码,代码会正常失败。为此,我需要能够测试程序是否存在。我知道如何测试文件是否存在,但我不确定如何测试以查看应用程序是否在路径中可执行。我宁愿使用 $PATH,因为其中一些需要在 arch、ubuntu 和 centos 上工作。有些可能安装在我的 homedir 中,在我没有 root 的系统上,有些可能没有安装,而有些则安装在系统路径中。
在如何将 HEREDOC 文本带入 shell 脚本变量中?有人报告了一个问题,使用here 文档在$(...)命令替换内使用带引号的分隔符,其中\文档内行尾的反斜杠触发换行符连接行继续,而命令替换外的相同 here 文档按预期工作。
这是一个简化的示例文档:
cat <<'EOT'
abc ` def
ghi \
jkl
EOT
Run Code Online (Sandbox Code Playgroud)
这包括一行末尾的一个反引号和一个反斜杠。分隔符被引用,因此正文内部不会发生扩展。在所有 Bourne-alikes 中,我可以找到逐字输出内容。如果我将相同的文档放在命令替换中,如下所示:
x=$(cat <<'EOT'
abc ` def
ghi \
jkl
EOT
)
echo "$x"
Run Code Online (Sandbox Code Playgroud)
那么它们的行为不再相同:
dash、ash、zsh、ksh93、 BusyBox ash、mksh和 SunOS 5.10 POSIXsh都像以前一样给出了文档的逐字内容。--posix选项不影响此。Kusalananda告诉我(谢谢!)它的pdksh行为方式相同。在最初的问题中,我说这是 Bash …
我刚刚遇到了一个fc命令,它可以让您编辑上一个命令并在之后发出它。
它有自己的FCEDIT用于设置编辑器的环境变量,以及POSIX 程序员手册( 1p) 中的手册页。
它在/tmp目录中创建一个文件并在保存文件时执行内容(:wqin vim)。
除此之外,它还可以编号并列出fc -l以前执行的命令以供选择。
所以知道这个命令真的很好很方便。
问题是它的名字的真正含义是什么?如何将命令与其功能联系起来?
“一流”?或者甚至只是作为“功能”(写完上一句后我想到了什么)?
该手册将其简称为“fc 实用程序”。
在 POSIX Shell 中对变量进行 pre/post 递增时,这两个示例之间有什么区别。它们看起来会产生相同的结果,但它们的使用方式会不同吗?你什么时候更喜欢一个?
X=$((X+1))
: $((X=X+1))
Run Code Online (Sandbox Code Playgroud) 我刚刚注意到,POSIXdate似乎没有%s或%N格式项。所以我不能使用那些。在我的 shell 脚本中获取纪元时间戳的替代方法是什么?
posix ×10
shell-script ×7
shell ×4
chmod ×1
command ×1
dash ×1
date ×1
exec ×1
find ×1
gnu ×1
path ×1
permissions ×1
time ×1
timestamps ×1
zsh ×1