我注意到我从其他人那里获得的一些脚本有 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比第二个更受欢迎?
在 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一次读取一个字符。
怎么样的概念和安全性方面?
以下行创建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) 我在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 具有可执行权限。
怎么了?
问题可能不清楚且过于宽泛,但任何答案,无论它是短还是宽,都非常感谢。
前段时间我要求在我们的生产服务器上安装 zsh。我的管理员公司回复说这是无法完成的,因为这是生产服务器,而不是开发服务器。
过去 5 年我一直使用 zsh 和 oh-my-zsh,并且非常喜欢它,zsh 让我的工作更轻松、更快捷。但这还不够。
我不擅长安全或可能涉及的其他问题,这就是为什么我的问题是:
我试图阻止用户在不从机器上物理移除闪存卡的情况下关闭或重新启动。为此,我编写了一个 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 本身向控制台输出一条消息,表明它正在运行提示用户删除闪存卡的作业,这一事实挽救了该服务的目的。
向控制台发出消息的正确方法是什么?
我有这个代码:
[[ "$1" =~ [/\\]$ ]]
Run Code Online (Sandbox Code Playgroud)
在 linux 上它工作得很好,但是当我在 FreeBSD 上测试它时发生了一个错误:./projekt2.sh: [[: not found
它......我有任何替代方法可以在两个系统上工作吗?谢谢
BASH 版本:4.3.30(1)-发布
bash ×2
shebang ×2
shell ×2
shell-script ×2
console ×1
executable ×1
freebsd ×1
kali-linux ×1
shutdown ×1
systemd ×1
zsh ×1