Unix & Linux

Linux,FreeBSD和其他类似Un * x的操作系统用户的问答



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 

3
/ etc / hosts和DNS如何一起工作以将主机名解析为IP地址?
在Linux中,/etc/hostsDNS 如何与DNS一起工作以将主机名解析为IP地址? 如果可以在中解析主机名/etc/hosts,DNS是在/etc/hosts 解析主机名之后应用还是将解析后的IP地址 /etc/hosts当作“主机名”进行递归解析? 在我的浏览器(firefox和google chrome)中,当我添加到时 /etc/hosts: 127.0.0.1 google.com www.google.com 在浏览器的地址栏中输入www.google.com,然后按Enter键将无法连接到该网站。从中删除该行之后/etc/hosts,我可以连接到该网站。这是否意味着要/etc/hosts覆盖DNS才能解析主机名? 将行重新添加到/etc/hosts后,即使刷新网页后,我仍然可以连接到该网站。为什么不 /etc/hosts再次申请,以致我无法连接到该网站? 谢谢。



2
为什么sudoedit写入临时目录?
我曾经sudoedit创建一个文件: $ sudoedit /etc/systemd/system/apache2.service 但是当我去保存文件时,它把它写在一个临时目录(/ var / temp / blahblah)中。到底是怎么回事?为什么不将其保存到系统目录?
10 sudoedit 

2
在32位内核上运行64位Userland软件需要什么?
在Linux和Windows上,我习惯于以下情况:我需要64位内核才能拥有具有multiarch / WoW的系统,在该系统中可以并行运行32位和64位软件。 然后,几年前,当有人向我展示MacOS 10.6 Snow Leopard可以在32位模式下运行带有内核的64位应用程序时,我大为震惊。现在这可能在很大程度上被忘记了,因为这是一次技术转换。据我所知,随着硬件在移动领域的领先地位,就我所知,在将iOS和Android移植到64位系统时,这是永远不需要的。 我的问题:在32位Linux内核(i386或armhf)中获得相同的功能需要什么? 我了解这可能并不简单。如果是这样,Microsoft可能会将其放入32位Windows XP中。一般要求是什么?有没有提议的补丁或概念证明? 在嵌入式世界中,我认为这将特别有帮助,因为64位支持可能会在设备驱动程序中长期滞后。

1
macOS Mojave目录权限
MacOS Mojave已将SIP的作用扩展到用户的主目录中。默认情况下,拒绝访问用户主目录中的许多目录。这些目录的一些示例如下。 ~/Library/Messages ~/Library/Mail ~/Library/Safari [… etc.] 为了从终端访问这些目录,必须在系统偏好设置>安全性和隐私>隐私>全磁盘访问中定义终端应用程序。除了我系统上的以下目录外,该配置均有效。容器中的其他数据可能存在相同的行为-不确定。 ~/Library/Containers/com.apple.mail/Data/DataVaults 有趣的行为易于再现。该目录甚至不可见。 cd ~/Library/Containers/com.apple.mail/Data ls ls: DataVaults: Operation not permitted 我曾经将rsync主目录镜像到外部硬盘驱动器;但是,我不能再这样做了,因为rsync抱怨“遇到IO错误-跳过文件删除”,这破坏了镜像效果。我找不到有关此问题的任何文档。苹果公司的支持不知道。为什么这个目录很特殊?如何在不禁用SIP的情况下访问它? 禁用SIP的进一步调查结果 根据系统信息,Mojave升级是在2018年9月24日进行的。该目录也是在同一天创建的。我的用户拥有目录,职员组是组所有者。它的许可权是0700。它具有扩展的属性,如@符号所示。没有ACL。没有标志。 xattr -l ~/Library/Containers/com.apple.mail/Data/DataVaults com.apple.quarantine: 0082;00000000;Mail; com.apple.rootless: Mail ls -lO DataVaults (no result; exit 0) 禁用SIP,删除目录并重新启用SIP后,打开邮件后,目录将以相同的权限重新出现。Mail(版本12.0(3445.100.39))没有插件。 2018年10月16日全新安装的结果 格式化并重新安装后,该目录不存在。我仍然不知道它是如何开始的。 2019年3月29日升级的结果 与升级到Mojave 10.14.4(18E226)和/或Mail版本12.4(3445.104.8)一致,该目录已重新出现。
10 permissions  osx 

3
如何在Debian上的sddm中禁用关机和重启按钮?
我尝试了什么:我创建了文件/etc/sddm/sddm.conf(也尝试了/etc/sddm.conf),其内容如下: [General] HaltCommand=true RebootCommand=true 不幸的是,这无济于事-重新启动按钮继续起作用。优选地,按钮也应该消失。 编辑:我想澄清一下,我不希望true被解释为布尔值,我希望将其解释为命令。这true是一个有效的命令,因为/bin/true大多数Linux系统上都有可执行文件,除了返回退出状态成功之外,什么都不做。为了确保这不是路径问题,我还尝试将其设置为/bin/true也没有帮助。
10 debian  sddm 

3
.ssh / config主机可以有多个HostName条目吗?
我已经设置了ssh和路由器端口转发,以便在不在家时可以ssh进入家庭网络中的计算机。当前,我的.ssh/config文件中有两个条目,一个用于当我在家庭网络中时,另一个用于当我不在家庭网络中时: Host mycomputer HostName 192.168.X.X Host mycomputerathome HostName my.no-ip.dynamic 这行得通,但我想知道是否可以使自己更轻松。我希望有一种方法可以列出多个HostName条目,这样,如果第一个失败,它会退回到第二个: Host mycomputer HostName 192.168.X.X HostName my.no-ip.dynamic 因此,它将首先尝试连接到本地网络上的主机,如果该主机不存在,它将尝试使用我的no-ip动态主机名进行连接。我尝试输入两个主机名,但ssh mycomputer只运行了什么也不做的块。 我已经关闭了密码验证功能,以支持密钥,因此在不在本地网络上时意外连接到本地计算机上的计算机,也不会冒我的密码无法进入任何地方的风险。 如果第一个不起作用,是否可以指定备用主机名来尝试?
10 ssh 

1
为什么nohup后台进程被杀死?
我尝试通过远程会话启动Shell脚本,该会话使用命令在后台启动进程。 nohup python3 run.py > nohup.out & 当远程会话关闭时,该进程将被消息杀死: 捕获信号SIGHUP SIGHUP被捕获但未被守护。正在退出。 我不明白 为什么使用nohup&在后台启动该进程会被杀死?

3
如何问终结者偏好菜单?
我是终结者的忠实粉丝。默认情况下,通过在终端上单击鼠标右键可以访问首选项菜单。我刚刚配置了Terminator,以便在右键单击上进行复制粘贴(类似于Putty)。 不幸的是,这使得首选项菜单不再可用。解决办法是什么?

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.