为什么我的 strace 命令不适用于鱼?
Why my strace command is not working with fish?
我正在尝试启动一个我可以用 Bash 启动但不能用 Fish 启动的命令:
- 在 Bash 上运行良好:
$ sudo strace -f -s3000 -p $(pgrep -f teams -d " -p ") -o /tmp/debug.log
strace: Process 49774 attached with 32 threads
strace: Process 49778 attached
strace: Process 49780 attached
strace: Process 49817 attached with 10 threads
strace: Process 49824 attached with 6 threads
strace: Process 49848 attached with 13 threads
strace: Process 55055 attached with 6 threads
strace: Process 56914 attached with 17 threads
strace: Process 56965 attached with 44 threads
strace: Process 57041 attached with 10 threads
- 在 Fish 上,我正在尝试同样的操作,但没有“$”,但出现错误:
$ sudo strace -f -s3000 -p (pgrep -f teams -d " -p ") -o /tmp/debug.log
strace: Invalid process id: '-p'
这个strace是为了跟踪Teams的所有进程,这里只是pgrep命令(供参考):
$ pgrep -f teams -d " -p "
49774 -p 49778 -p 49780 -p 49817 -p 49824 -p 49848 -p 55055 -p 56914 -p 56965 -p 57041
有什么想法吗?
您可以分段构建命令选项:
set opts -f -s3000 -o /tmp/file
for pid in (pgrep -f team); set opts $opts -p $pid; end
sudo strace $opts
这利用了 fish 变量的列表特性。
首先,在变量中设置 pgrep 并用空格分割字符串
$ set PROCS (string split ' ' (pgrep -f teams -d " -p"))
然后调用它:
$ sudo strace -f -s3000 -p $PROCS -o /tmp/debug.log
与 bash 不同,fish 仅在 换行符 上拆分命令替换,而不是空格或制表符或其他任何内容。
这意味着当您的 9774 -p 49778 -p 49780
作为 一个参数 传递给 strace
时,您希望它是五个 - 9774
, -p
, 49778
, -p
, 49780
.
解决方案是将其显式拆分为 string split
:
sudo strace -f -s3000 -p (pgrep -f teams -d " -p " | string split " ") -o /tmp/debug.log
我正在尝试启动一个我可以用 Bash 启动但不能用 Fish 启动的命令:
- 在 Bash 上运行良好:
$ sudo strace -f -s3000 -p $(pgrep -f teams -d " -p ") -o /tmp/debug.log
strace: Process 49774 attached with 32 threads
strace: Process 49778 attached
strace: Process 49780 attached
strace: Process 49817 attached with 10 threads
strace: Process 49824 attached with 6 threads
strace: Process 49848 attached with 13 threads
strace: Process 55055 attached with 6 threads
strace: Process 56914 attached with 17 threads
strace: Process 56965 attached with 44 threads
strace: Process 57041 attached with 10 threads
- 在 Fish 上,我正在尝试同样的操作,但没有“$”,但出现错误:
$ sudo strace -f -s3000 -p (pgrep -f teams -d " -p ") -o /tmp/debug.log
strace: Invalid process id: '-p'
这个strace是为了跟踪Teams的所有进程,这里只是pgrep命令(供参考):
$ pgrep -f teams -d " -p "
49774 -p 49778 -p 49780 -p 49817 -p 49824 -p 49848 -p 55055 -p 56914 -p 56965 -p 57041
有什么想法吗?
您可以分段构建命令选项:
set opts -f -s3000 -o /tmp/file
for pid in (pgrep -f team); set opts $opts -p $pid; end
sudo strace $opts
这利用了 fish 变量的列表特性。
首先,在变量中设置 pgrep 并用空格分割字符串
$ set PROCS (string split ' ' (pgrep -f teams -d " -p"))
然后调用它:
$ sudo strace -f -s3000 -p $PROCS -o /tmp/debug.log
与 bash 不同,fish 仅在 换行符 上拆分命令替换,而不是空格或制表符或其他任何内容。
这意味着当您的 9774 -p 49778 -p 49780
作为 一个参数 传递给 strace
时,您希望它是五个 - 9774
, -p
, 49778
, -p
, 49780
.
解决方案是将其显式拆分为 string split
:
sudo strace -f -s3000 -p (pgrep -f teams -d " -p " | string split " ") -o /tmp/debug.log