当寻找的路径,可执行文件或检查,如果你在Unix shell中输入命令的名称会发生什么,有不同的公用事业过多(which,type,command,whence,where,whereis,whatis,hash,等)。
我们经常听说which应该避免。为什么?我们应该用什么来代替?
我一直看到引用此链接的答案明确指出“不要解析ls!” 这让我感到困扰有几个原因:
似乎该链接中的信息已被批量接受,几乎没有问题,尽管我可以在随意阅读中至少挑出一些错误。
该链接中所述的问题似乎也引发了不想找到解决方案的愿望。
从第一段:
...当你要求
[ls]一个文件列表时,有一个大问题:Unix 允许文件名中的几乎任何字符,包括空格、换行符、逗号、管道符号,以及几乎任何你曾经尝试用作除 NUL 外的分隔符。...ls用换行符分隔文件名。这很好,直到您的文件名称中包含换行符。并且由于我不知道任何ls允许您使用 NUL 字符而不是换行符终止文件名的实现,这使我们无法使用ls.
无赖,对吧?如何以往我们可以处理一个换行符终止的上市数据集可能包含换行符的数据?好吧,如果这个网站上回答问题的人不是每天都做这种事情,我可能会认为我们遇到了麻烦。
事实是,大多数ls实现实际上提供了一个非常简单的 api 来解析它们的输出,我们一直在做,甚至没有意识到。您不仅可以以 null 结束文件名,还可以以 null 或您可能需要的任何其他任意字符串开头。更重要的是,您可以为每个文件类型分配这些任意字符串。请考虑:
LS_COLORS='lc=\0:rc=:ec=\0\0\0:fi=:di=:' ls -l --color=always | cat -A
total 4$
drwxr-xr-x 1 mikeserv mikeserv 0 Jul 10 01:05 ^@^@^@^@dir^@^@^@/$
-rw-r--r-- 1 mikeserv mikeserv 4 Jul 10 02:18 ^@file1^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul 10 01:08 ^@file2^@^@^@$
-rw-r--r-- 1 mikeserv mikeserv 0 Jul …Run Code Online (Sandbox Code Playgroud) 如果您已经关注 unix.stackexchange.com 一段时间了,那么您现在应该知道,echo $var在 Bourne/POSIX shell(zsh 是例外)中的列表上下文(如)中不加引号的变量具有非常特殊的含义,并且除非你有很好的理由,否则不应该这样做。
在这里的许多问答中详细讨论了它(例如:为什么我的 shell 脚本会因空格或其他特殊字符而窒息?,何时需要双引号?,shell 变量的扩展以及 glob 和 split 对其的影响,引用vs 不带引号的字符串扩展)
自从 70 年代末 Bourne shell 首次发布以来就是这种情况,并且没有被 Korn shell 改变(David Korn 最大的遗憾之一(问题 #7))或者bash大部分复制了 Korn shell,这就是POSIX/Unix 是如何指定的。
现在,我们仍然在这里看到许多答案,甚至偶尔会公开发布未引用变量的 shell 代码。你会认为人们现在已经学会了。
根据我的经验,主要有 3 类人会省略引用他们的变量:
初学者。这些可以被原谅,因为它是一种完全不直观的语法。我们在这个网站上的职责是教育他们。
健忘的人。
即使经过反复锤击也不相信的人,他们认为Bourne shell 的作者肯定没有打算让我们引用所有变量。
如果我们揭露与此类行为相关的风险,也许我们可以说服他们。
如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?
我们在这里谈论什么样的漏洞?
在什么情况下会出现问题?
我正在阅读一篇关于crontab的文章
有一些关于禁用自动发送电子邮件的功能。
禁用电子邮件 默认情况下,cron 作业会向执行 cronjob 的用户帐户发送一封电子邮件。如果不需要,请将以下命令放在 cron 作业行的末尾。
Run Code Online (Sandbox Code Playgroud)>/dev/null 2>&1
2 > &和的详细意思是1什么?为什么将其放在 crontab 文件的末尾会关闭电子邮件发送功能?
如何在 UNIX 中复制文件内容而不显示文件内容。我不想 cat 或 vi 看到内容。
我想将它们复制到剪贴板,以便我可以将其粘贴回我的 Windows 记事本。
由于访问限制,我无法将文件从该服务器复制到另一台服务器。
在整个 POSIX 规范中,都有规定 ( 1 , 2 , 3 ...) 允许实现/特别处理以 2 开头的路径。
POSIX 应用程序(根据 POSIX 规范编写的应用程序可移植到所有 POSIX 兼容系统)不能假设//foo/bar与 相同/foo/bar(尽管他们可以假设///foo/bar与 相同/foo/bar)。
现在那些//foo特殊对待的 POSIX 系统(历史悠久且仍在维护)是什么?我相信(我现在被证明是错误的)微软为他们的 Unix 变体 (XENIX) 和可能的 Windows POSIX 层推送了 POSIX 条款(有人能证实吗?)。
它被 Cygwin 使用,Cygwin 也是 Microsoft Windows 的类似 POSIX 的层。是否有任何非 Microsoft Windows 系统?开放虚拟机?
在//foo/bar特殊的系统上,它用于什么?//host/path用于网络文件系统访问?虚拟文件系统?
某些运行在类 Unix 系统上的应用程序(如果不是系统的 API)是否会//foo/bar特别处理路径(在它们否则将其/foo/bar视为文件系统上的路径的上下文中)?
编辑,此后我在奥斯汀组邮件列表上询问了//foo/bar有关规范中处理起源的问题,并且讨论很有趣(至少从考古学的角度来看)。
在谷歌搜索了一下之后,我找不到一种简单的方法来使用 shell 命令生成一个包含在特定范围内的随机十进制整数,即介于最小值和最大值之间。
我读过/dev/random,/dev/urandom和$RANDOM,但这些都不能满足我的需要。
有没有其他有用的命令,或者使用以前数据的方法?
假设当我执行 ls 命令时,输出是:
file1 file2 file3 file4
Run Code Online (Sandbox Code Playgroud)
是否可以只显示特定的输出列,在这种情况下是 file2?我尝试了以下方法但没有成功:
echo ls | $2
Run Code Online (Sandbox Code Playgroud)
基本上我只想回显第二列,在这种情况下,我想回显:
file2
Run Code Online (Sandbox Code Playgroud) 如何获取包含名称与特定模式匹配的文件的子目录列表?
更具体地说,我正在寻找包含文件名中出现字母“f”的文件的目录。
理想情况下,该列表不会有重复项,并且只包含没有文件名的路径。
在 2013-01-10 Glenn Fowler 将此发布到ast-users 邮件列表:
正如在 AST 和 UWIN 列表中多次指出的那样,AT&T 对 OpenSouce 软件的支持很少,这就是为什么我们很少有人参与我们相当大的 AST 软件集合。尽管如此
ksh,nmake、vczip、UWIN和其他 AST 工具仍在几个 AT&T 项目中继续使用。事实证明,软件并不是唯一缺乏支持的东西:dgk (David Korn)(AT&T 研究员,服务 36 年)和 gsf (Glenn Fowler)(AT&T 研究员,服务 29 年)都已终止,10 月生效10. 我们的第三个主要合作伙伴 Phong Vo(AT&T 研究员,服务 32 年)几个月前离开了 Google。UWIN 维护者 Jeff Fellin 仍在 AT&T 工作,并为一些关键操作提供 UWIN 支持。
dgk 和 gsf 都将继续在 AST 软件上工作,并且实际上可能有更多的时间(至少在短期内)专注于它。
下载站点和邮件组将至少在接下来的几个月内保留在 AT&T 中。我们的 AT&T 同事 dr.ek,AST 用户和错误检测器,将维护该站点。我们已经保护了 astopen.org 域,并且正在研究非 AT&T 托管选项,包括带有错误跟踪功能的存储库。
改变的过程需要时间;用户社区的耐心将不胜感激。在一个基本上稳定了近 30 年的环境中工作后,有 …