场景:进程创建管道并与之CreateNamedPipe()连接ConnectNamedPipe(),传输一些数据,然后退出(没有清理).管道是否仍然存在?它的另一面(在不同的进程中打开)是否在CreateFile()创建过程退出时出错?
更一般地说,命名管道的寿命是多少?如何清理过时的管道?
我没有shell脚本的经验,所以我无法看到以下情况的问题:
我已经定义了以下形式的别名(file.c位于~/dir):
alias code="cd ~/dir | vim file.c"
Run Code Online (Sandbox Code Playgroud)
输入时,我收到以下警告,并且没有打开正确的文件:
Vim: Warning: Input is not from a terminal
2 files to edit
Run Code Online (Sandbox Code Playgroud)
我认为这个实例中的管道操作符会将两个命令分开,首先更改目录,然后打开文件.
我正在尝试处理如下工作的服务器:
我希望能够检测到子进程的管道写入何时失败; 并发出特别通知.
通常,我会通过$SIG{PIPE}在父进程中创建自定义处理程序来实现这一点.
但是,我关心的是,父启动执行命令的某些进程可能会打开自己的管道; 如果写入THOSE管道失败,我想简单地忽略SIGPIPE.
Q1.有没有办法让我从SIGPIPE处理程序中告诉,哪个打开的管道发出了信号?(我知道每个孩子的PID,所以PID会很好......或者如果有办法通过文件描述符#s?).
Q2.我可以用local $SIG{PIPE}某种方式解决问题吗?我的假设是我需要:
local $SIG{PIPE}在写入该管道之前设置特定于助手进程的权限print $HELPER_PIPE(这只发生在一个子程序中)DEFAULT或IGNORE我有以下bash脚本,它将表格数据作为输入,获取第一行并垂直吐出它们:
#!/bin/bash
# my_script.sh
export LC_ALL=C
file=$1
head -n1 $file |
tr "\t" "\n" |
awk '{print $1 " " NR-1}'
Run Code Online (Sandbox Code Playgroud)
问题是我只能这样执行:
$ myscript.sh some_tab_file.txt
Run Code Online (Sandbox Code Playgroud)
我想要做的是在上述功能之上还允许你这样做:
$ cat some_tab_file.txt myscript.sh | myscript.sh
Run Code Online (Sandbox Code Playgroud)
即从管道输出中取出它.我怎样才能做到这一点?
我正在编写一个小的bash脚本,以获取每个文件名中的数字。例如,文件名将helloworld1.txt产生1。
尝试将输出设置为变量时i,每个文件都出现错误。
line 5: 985.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)
如果我只是回显命令echo $f | tr -dc '[0-9]'而不是将其分配给变量,那么一切都很好。
#!/bin/bash
for f in *
do
i=`$f | tr -dc '[0-9]'` // Permission denied.
echo $i
done
Run Code Online (Sandbox Code Playgroud) 当我做:
sudo strace -p PID 2>&1 | grep -v "recvmsg"
Run Code Online (Sandbox Code Playgroud)
grep匹配它应该匹配的行,但是当我这样做时:
sudo strace -p PID|grep -v "recvmsg"
Run Code Online (Sandbox Code Playgroud)
它仍然显示所有呼叫.这是为什么?
我正在尝试编写一个bash脚本来操作从xsel传输的数据.
...
ary=()
while read data; do
echo $data
ary=( "${ary[@]}" "$data" )
done
Run Code Online (Sandbox Code Playgroud)
问题是我打电话时没有看到任何东西:
xsel | myscript.sh
Run Code Online (Sandbox Code Playgroud)
我试过了
echo "testing testing" | myscript.sh
Run Code Online (Sandbox Code Playgroud)
这确实有效,而且我也确保有来自xsel的东西
xsel | festival --tts --pipe
# will read the clipboard string piped from xsel aloud
Run Code Online (Sandbox Code Playgroud)
有什么建议?提前致谢
使用此脚本我试图检测是否有网络链接.我没有将多个命令放在一行(ethtool ...).该怎么办?
#!/bin/bash
COMMAND="( /sbin/ethtool eth0 ) | ( /bin/grep \"Link detected: yes\" ) | ( wc -l )"
ONLINE=eval $COMMAND
if $ONLINE; then
echo "Online"
else
echo "Not online"
fi
Run Code Online (Sandbox Code Playgroud) <<<在这个命令行中意味着什么?
bc <<< "1 + 1"
Run Code Online (Sandbox Code Playgroud)
它似乎并不组合<和<<,我不能为它找到文档.它似乎表现得像
echo "1 + 1" | bc
Run Code Online (Sandbox Code Playgroud)
也适用于ksh,但不在sh.
我最近写了一个简单的shell.我实现管道时出现了这个问题.
我知道在Ubuntu命令行参数的最大长度为2097152.(通过此)
#define MAX_CMD_LEN 2097152
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有最大数量的管道命令?例如:( n的数量)
ps -aux |?grep "a.out" | awk '{print $5}' | top | ... | cat
1 | 2 | 3 | 4 | ... | n
Run Code Online (Sandbox Code Playgroud)