我不是在寻找该问题的变通方法或解决方案。我很好,它在bash. 我只是不明白为什么它不起作用。
我正在寻找为什么以下脚本不起作用的深入答案。所有以前的互联网搜索结果,包括来自 unix.stackexchange.com 的帖子,都无法真正完全清除这一点。它与read读取有关,stdin它不起作用,因为stdin已经通过管道cat喂食“采取”(?)bash?
示例 bash 脚本test.sh:
echo "Please say name:"
read NAME
echo "Hello $NAME"
Run Code Online (Sandbox Code Playgroud)
方法 1 调用脚本bash test.sh:
$ bash test.sh
Please say name:
XYZ
Hello XYZ
$
Run Code Online (Sandbox Code Playgroud)
方法 2 通过管道运行脚本bash:
$ cat test.sh | bash
Please say name:
$
Run Code Online (Sandbox Code Playgroud)
因此脚本立即返回到提示,无需等待输入甚至打印第二行。
我不明白为什么当我chmod使用fakeroot.
最初,该文件具有以下权限:
-rwxr-xr-x a.txt*
Run Code Online (Sandbox Code Playgroud)
当我尝试使用 chmod 更改文件的权限时,它工作正常:
chmod 111 a.txt
---x--x--x a.txt*
Run Code Online (Sandbox Code Playgroud)
当我用fakeroot它运行它时,它似乎不能正常工作。它正确设置了组和其他的权限,但不是为用户设置的。无论chmod命令中的第一个值是什么,读取和写入的权限都已设置。
fakeroot chmod 111 a.txt
-rwx--x--x a.txt*
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我只想等待用户通过按 确认消息Return。在 bash 中,我可以调用
$ read
$
Run Code Online (Sandbox Code Playgroud)
但是,在 sh (在我的情况下是破折号),我得到
$ read
sh: 1: read: arg count
$
Run Code Online (Sandbox Code Playgroud)
看来我必须提供一个论点?这种差异从何而来?
当我第一次连接到 Dropbear SSH 服务器时,我收到以下消息:
me@laptop:~$ ssh me@server
The authenticity of host 'server' can't be established.
RSA key fingerprint is SHA256:NycCxoRiiSAGA7Rvlnuf1gU8pazIpXJKZ3ukdivyam8.
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)
为了确保这是正确的服务器,我想将该消息中指定的指纹与服务器的真实指纹进行比较。如何找到服务器的 RSA 主机密钥指纹?
当我使用同一用户登录tty1并tty2启动 X 服务器会话时tty1- 一旦我注销tty2,X 服务器会话就会tty1崩溃。
这似乎是一个已知的错误:
正如您在错误报告中所读到的,问题在于对clear_consolein的调用~/.bash_logout。如果我删除该行,一切都会正常。
我的问题:
我没有注意到任何变化。(显然,除了 X 服务器不再崩溃。)当我注销时,控制台正在被清除 - 无论我删除该行。clear_console那么,首先打电话到那里的目的是什么?
我在我的脚本中使用以下行:
ssh -f -N -M -S <control socket> <host>
Run Code Online (Sandbox Code Playgroud)
这意味着初始连接仅保留在后台,我可以将其用于后续调用ssh:
ssh -S <control socket> <host> <command>
Run Code Online (Sandbox Code Playgroud)
但是,如果我有多个带有命令的脚本,这些脚本应该使用相同的控制套接字并将“后台”调用ssh放入所有脚本中,我将在某个时候收到以下消息:
Run Code Online (Sandbox Code Playgroud)ControlSocket <control socket> already exists, disabling multiplexing
这对脚本的其余部分没有影响,因为显然套接字存在并且可以被后续ssh命令使用。然而,即使“后台”会话无法打开套接字,它也不会退出并保持活动状态——只是没有多路复用。
使用[ -S或ssh -O check检查套接字的存在仍然会留下竞争条件的可能性。
如何执行“如果尚不存在则打开控制套接字,如果存在则退出”?
在脚本中,我有一长串打印到标准输出的命令。我想隐藏所有输出。因此,我没有重定向每个命令,而是将
exec >/dev/null
Run Code Online (Sandbox Code Playgroud)
一开始。
我必须使用哪些选项来“暂时忽略”一般重定向并echo在实际打印到标准输出之间进行一次调用?
我的笔记本电脑有一个 SSD 驱动器,我运行一个脚本,每隔一秒写入一次/sys/class/thermal/cooling_device4/cur_state. 我不认为这会算作写入 SSD 并因此减少其剩余的写入周期数,因为procfs和sysfs是虚拟文件系统。
还是我忽略了一些东西,这是一个问题?
当我第一次想向-h我的程序添加一个选项时,我偶然发现了一个-h已经在使用的错误:使用add_help=True,Python 会argparse自动为参数-h和--help.
但是对于大多数程序来说,同时使用-hand--help来显示帮助页面不是这样的,是吗?哪些流行的命令甚至有-h缩写--help?我查看了一些命令,通常它是--human-readable或其他与帮助无关的选项的缩写。使用-h您的帮助消息不工作,ls,cd,df和diff例如-短短的命令是我测试过,当然不是一个详尽的或代表名单,但很受欢迎的命令。
可能-h在历史上一直用作显示帮助页面的默认参数,--help后来才出现?man或info页面从哪里进入?
-h如果这是流行的默认设置,我不想通过使用帮助页面以外的其他内容来混淆用户。但是,就个人而言,我从未使用过-h并且一直在使用--help.
bash ×4
scripting ×3
linux ×2
read ×2
shell-script ×2
ssh ×2
ubuntu ×2
chmod ×1
command ×1
command-line ×1
dash ×1
debian ×1
dropbear ×1
echo ×1
exec ×1
fakeroot ×1
files ×1
filesystems ×1
fingerprint ×1
freebsd ×1
history ×1
permissions ×1
pipe ×1
proc ×1
shell ×1
ssd ×1
ssh-keygen ×1
stdin ×1
stdout ×1
x-server ×1
xorg ×1