相关疑难解决方法(0)

为什么 unbuffer -p 会破坏其输入?

$ seq 10 | unbuffer -p od -vtc
0000000   1  \n   2  \n   3  \n   4  \n   5  \n   6  \n   7  \n   8  \n
Run Code Online (Sandbox Code Playgroud)

去了哪910

$ printf '\r' | unbuffer -p od -An -w1 -vtc
  \n
Run Code Online (Sandbox Code Playgroud)

为什么\r改为\n

$ : | unbuffer -p printf '\n' | od -An -w1 -vtc
  \r
  \n
$ unbuffer -p printf '\n' | od -An -w1 -vtc
  \r
      \n
Run Code Online (Sandbox Code Playgroud)

搞什么?

$ printf foo | unbuffer -p cat …
Run Code Online (Sandbox Code Playgroud)

buffer expect

18
推荐指数
1
解决办法
1331
查看次数

为什么在简单的 bash 命令中没有明显的 clone 或 fork 以及它是如何完成的?

考虑以下(含sh/bin/dash):

$ strace -e trace=process sh -c 'grep "^Pid:" /proc/self/status /proc/$$/status'
execve("/bin/sh", ["sh", "-c", "grep \"^Pid:\" /proc/self/status /"...], [/* 47 vars */]) = 0
arch_prctl(ARCH_SET_FS, 0x7fcc8b661540) = 0
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fcc8b661810) = 24865
wait4(-1, /proc/self/status:Pid:    24865
/proc/24864/status:Pid: 24864
[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 24865
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=24865, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
exit_group(0)                           = ?
+++ exited with 0 +++
Run Code Online (Sandbox Code Playgroud)

没有什么不寻常的,从主 shell 进程中grep替换了一个分叉进程(这里是通过 完成的clone())。到现在为止还挺好。

现在使用 bash 4.4: …

shell strace syscalls

8
推荐指数
2
解决办法
2182
查看次数

标签 统计

buffer ×1

expect ×1

shell ×1

strace ×1

syscalls ×1