我知道这不是一个描述性很强的标题(欢迎提出建议),但事实是我已经为此烦恼了好几个小时,而且我不知道问题的根源可能在哪里。
我为本地网络上的对等点之间的 CLI 聊天编写了一个简单的 Bash 脚本:
#!/usr/bin/env bash
# Usage: ./lanchat <local_ip>:<local_port> <remote_ip>:<remote_port>
# set -x
set -o errexit -o nounset -o pipefail
IFS=':' read -a socket <<< "$1"
LOCAL_IP=${socket[0]}
LOCAL_PORT=${socket[1]}
IFS=':' read -a socket <<< "$2"
REMOTE_IP=${socket[0]}
REMOTE_PORT=${socket[1]}
RECV_FIFO=".tmp.lanchat"
trap "rm '$RECV_FIFO'; kill 0" EXIT
mkfifo "$RECV_FIFO"
# EDIT: As per @Kamil Maciorowski's suggestion, removing the `-q 0` part below solves the issue.
while true; do nc -n -l -q 0 -s "$LOCAL_IP" -p "$LOCAL_PORT" > "$RECV_FIFO"; done & …
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么某些 shell 在使用sudo调用时似乎会受到特殊处理调用时似乎会受到特殊处理。例如,似乎有两种可能的行为:
\n“隐式”组(pstree是sudo的直接子级,中间没有 shell):
\n$ sudo pstree -s $$\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n$ sudo bash -c \'pstree -s $$\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n$ sudo zsh -c \'pstree -s $$\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n$ sudo dash -c \'pstree -s $$\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n
Run Code Online (Sandbox Code Playgroud)\n“显式”组(shell 是sudo的直接子级)的直接子级):
\n$ sudo ksh -c \'pstree -s $$\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80ksh\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n$ sudo tcsh -c \'pstree -s $$\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80tcsh\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n$ sudo fish -c \'pstree -s $fish_pid\'\nsystemd\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80login\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80bash\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80fish\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pstree\n
Run Code Online (Sandbox Code Playgroud)\n显然sudo和一些 shell 之间似乎发生了某种集成,但我找不到任何相关文档。我还 grep 了sudo和bash的源代码,但也找不到任何线索。
这个另一个问题似乎相关:Why (...) does not …