相关疑难解决方法(0)

为什么最好使用“#!/usr/bin/env NAME”而不是“#!/path/to/NAME”作为我的shebang?

我注意到我从其他人那里获得的一些脚本有 shebang#!/path/to/NAME而其他人(使用相同的工具,NAME)有 shebang #!/usr/bin/env NAME

两者似乎都可以正常工作。在教程中(例如在 Python 上),似乎有人建议后者 shebang 更好。但是,我不太明白为什么会这样。

我意识到,为了使用后一个 shebang,NAME 必须在 PATH 中,而第一个 shebang 没有这个限制。

此外,(对我而言)第一个似乎是更好的shebang,因为它精确地指定了NAME 所在的位置。因此,在这种情况下,如果 NAME 有多个版本(例如,/usr/bin/NAME、/usr/local/bin/NAME),第一种情况指定使用哪个。

我的问题是为什么第一个shebang比第二个更受欢迎?

shell-script shebang

588
推荐指数
10
解决办法
25万
查看次数

为什么使用 shell 循环处理文本被认为是不好的做法?

在 POSIX shell 中使用while 循环来处理文本通常被认为是不好的做法吗?

正如Stéphane Chazelas 所指出的,不使用 shell 循环的一些原因是概念可靠性易读性性能安全性

这个答案解释了可靠性易读性方面:

while IFS= read -r line <&3; do
  printf '%s\n' "$line"
done 3< "$InputFile"
Run Code Online (Sandbox Code Playgroud)

为了性能,从文件或管道读取时,while循环和读取非常慢,因为内置read shell一次读取一个字符。

怎么样的概念安全性方面?

shell text-processing

241
推荐指数
4
解决办法
5万
查看次数

bash中算术扩展的评估

以下行创建file_c-6.txt但输出5

$ i=5; ls file_a-${i}.txt file_b-${i}.txt > file_c-$(( ++i )).txt; echo $i
5
$ cat file_c-6.txt
file_a-5.txt
file_b-5.txt
Run Code Online (Sandbox Code Playgroud)

如果删除>它会列出file_c-6.txt并输出5

我不明白为什么它没有保留i第一个示例中的值。

$ i=5; ls file_a-${i}.txt file_b-${i}.txt file_c-$(( ++i )).txt; echo $i
file_a-5.txt  file_b-5.txt  file_c-6.txt
6
Run Code Online (Sandbox Code Playgroud)

bash

13
推荐指数
1
解决办法
237
查看次数

Bash 脚本权限被拒绝和错误的解释器

我在kali linux 64位上。

我创建了一个 python 脚本,它需要 2 个参数来启动。我不想每次都输入完全相同的路径或搜索我在终端中使用的命令的历史记录。所以我决定创建一个简单的脚本,用它的参数调用 python 脚本。

#! /bin bash

python CreateDB.py ./WtfPath ./NoWtfPath/NewSystem/
Run Code Online (Sandbox Code Playgroud)

这与我在终端中使用的命令完全相同。但是,当我尝试执行脚本文件时收到错误消息。

bash: ./wtf.sh: /bin: bad interpreter: Permission denied
Run Code Online (Sandbox Code Playgroud)

wtf.sh 具有可执行权限。

怎么了?

executable shell-script shebang kali-linux

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

在生产服务器上安装 zsh 是否常见?

问题可能不清楚且过于宽泛,但任何答案,无论它是短还是宽,都非常感谢。

前段时间我要求在我们的生产服务器上安装 zsh。我的管理员公司回复说这是无法完成的,因为这是生产服务器,而不是开发服务器。

过去 5 年我一直使用 zsh 和 oh-my-zsh,并且非常喜欢它,zsh 让我的工作更轻松、更快捷。但这还不够。

我不擅长安全或可能涉及的其他问题,这就是为什么我的问题是:

  1. 在生产服务器上安装 zsh 对系统无害吗?
  2. 在这种情况下,您是否允许安装 zsh,为什么会这样?
  3. 在生产服务器上使用 bash 限制用户是否有意义?

zsh administration

7
推荐指数
2
解决办法
2903
查看次数

如何在关机期间写入控制台?

我试图阻止用户在不从机器上物理移除闪存卡的情况下关闭或重新启动。为此,我编写了一个 SystemD 服务,removeflash.service:

[Unit]
Description=Prompt user to remove flash card

[Service]
ExecStop=/usr/lib/systemd/flashshutdown.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
Requires=rsyslog.service
Run Code Online (Sandbox Code Playgroud)

flashshutdown.sh是一个bash脚本,如下:

#! /bin/bash
#
while [ -e /dev/flash ] ; do
    echo "Please remove flash card"
    logger "GHB: Please remove flash card"
    sleep 5
done
Run Code Online (Sandbox Code Playgroud)

我没想到 echo 在关闭时会做任何事情,而且它没有。但是,我希望 logger 命令能够工作。没有Requires=rsyslog.service,我的服务在rsyslog.service关闭后就退出了;我插入了防止这种情况发生的要求,但唯一的区别是,removeflash.service 的关闭在关闭顺序中较早。幸运的是,systemd 本身向控制台输出一条消息,表明它正在运行提示用户删除闪存卡的作业,这一事实挽救了该服务的目的。

向控制台发出消息的正确方法是什么?

shutdown systemd console

5
推荐指数
1
解决办法
1547
查看次数

FreeBSD 的双方括号

我有这个代码:

[[ "$1" =~ [/\\]$ ]]
Run Code Online (Sandbox Code Playgroud)

在 linux 上它工作得很好,但是当我在 FreeBSD 上测试它时发生了一个错误:./projekt2.sh: [[: not found它......我有任何替代方法可以在两个系统上工作吗?谢谢

BASH 版本:4.3.30(1)-发布

shell freebsd bash

3
推荐指数
1
解决办法
717
查看次数