我试图从我有一个程序的几个版本的目录中获取最大版本号
例如,如果ls的输出是
something01_1.sh
something02_0.1.2.sh
something02_0.1.sh
something02_1.1.sh
something02_1.2.sh
something02_2.0.sh
something02_2.1.sh
something02_2.3.sh
something02_3.1.2.sh
something.sh
Run Code Online (Sandbox Code Playgroud)
我得到的最大版本号如下 -
ls somedir | grep some_prefix | cut -d '_' -f2 | sort -t '.' -k1 -r | head -n 1
Run Code Online (Sandbox Code Playgroud)
现在,如果同时我想用我已经在系统中的版本号检查它,最好的方法是什么...
在bash我得到了这个工作(如果2.5是当前版本)
(ls somedir | grep some_prefix | cut -d '_' -f2; echo 2.5) | sort -t '.' -k1 -r | head -n 1
Run Code Online (Sandbox Code Playgroud)
有没有其他正确的方法呢?
编辑:在上面的例子中some_prefix是something02.
编辑:这里的实际问题是
(ls smthing; echo more) | sort
Run Code Online (Sandbox Code Playgroud)
它是将两个命令/程序的输出合并为第三个管道的最佳方法.
我正在打开grep命令的管道并逐行读取结果.完成后,我关闭管道.如果grep找到了什么,close()正常完成.如果grep 没有找到任何内容,则close()不起作用.
这是foo来演示这个问题:
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my $search = shift // die "Usage: foo search_string";
open my $grep_h, "grep '$search' ./foo |"
or die "open grep failed: $!";
while (defined (my $line = <$grep_h>)) {
chomp $line;
say "\t: $line";
}
close $grep_h or warn "Error closing grep pipe: $!";
Run Code Online (Sandbox Code Playgroud)
在这里,我调用foo来搜索'warn':
~/private/perl$ ./foo warn
: use warnings;
: close $grep_h or warn …Run Code Online (Sandbox Code Playgroud) 我有一个程序:
int main()
{
int* p_fd = (int*)malloc(2*sizeof(int));
char buf[100];
pipe(p_fd);
write(p_fd[1],"hello", strlen("hello"));
int n;
n = read(p_fd[0],buf,100);
//printf("n is: %d\n",n); // this line is important!
buf[n]="\0"; // this line triggers warning?
printf("%s\n",buf);
}
Run Code Online (Sandbox Code Playgroud)
当我编辑这个文件时,我总是得到警告:
[esolve@kitty temp]$ gcc -o temp temp.c
temp.c: In function ‘main’:
temp.c:38:9: warning: assignment makes integer from pointer without a cast [enabled by default]
Run Code Online (Sandbox Code Playgroud)
如果没有这一行printf("n is: %d\n",n);
,结果是:
[esolve@kitty temp]$ ./temp
hellon
Run Code Online (Sandbox Code Playgroud)
有了这一行,我得到了预期的结果:
[esolve@kitty temp$ ./temp
n is: 5
hello
Run Code Online (Sandbox Code Playgroud)
为什么这条线如此重要?谢谢!
这里有2段代码,值in $1是包含3行文本的文件名.
现在,我有一个问题.在第一段代码中,我无法从循环中获得"正确"的值,但在第二段代码中,我可以得到正确的结果.我不知道为什么.
如何让第一段代码得到正确的结果?
#!/bin/bash
count=0
cat "$1" | while read line
do
count=$[ $count + 1 ]
done
echo "$count line(s) in all."
#-----------------------------------------
count2=0
for var in a b c
do
count2=$[ $count2 + 1 ]
done
echo "$count2 line(s) in all."
Run Code Online (Sandbox Code Playgroud) 我在Linux中遇到管道问题.管道后看起来空格字符丢失了.运行以下C++代码
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main(){
char s[] = "ab cd", c;
int n = strlen(s);
for(int i = 0; i<n && (cin >> c); i++)
if(s[i] != c){
printf("wrong at %d : '%c' != '%c' \n", i, s[i], c);
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从
echo "ab cd" | ./checker
Run Code Online (Sandbox Code Playgroud)
shell命令给出
wrong at 2 : ' ' != 'c'
Run Code Online (Sandbox Code Playgroud)
这是正常的行为吗?如何避免丢失管道中的字符?
如果有人知道我对管道的帮助表示怀疑,
一个管道可以同时由多个进程共享,从而允许这些进程彼此交换“消息”。当同一管道有多个读取进程时,是否都可以读取同一条消息(仅发送一次而不是多个副本)?
在多线程环境中,写入管道时,进程发送的消息是否可能已损坏?
感谢收听
我刚刚在进程间通信中开始编程教育,这段代码是在父进程代码部分编写的.根据我所读到的内容write(),-1如果失败则返回,0如果没有写入,则返回,如果成功则返回pipe()正整数.究竟是如何sizeof(value)帮助我们识别出来的?不是if(write(request[WRITE],&value,sizeof(value) < 1)一个更友好的阅读替代什么的sizeof(value).
if(sizeof(value)!=write(request[WRITE],&value,sizeof(value)))
{
perror("Cannot write thru pipe.\n");
return 1;
}
Run Code Online (Sandbox Code Playgroud)
代码说明:变量value是父进程中数字的输入,然后父进程通过子管发送给子进程,子进程对其进行一些算术运算.
任何有关该主题的澄清的帮助都非常适用.
编辑:在提问时如何突出显示我的系统功能?
当postgres中的SQL语句写成如下所示时,这意味着什么?
SELECT
name||' ::: '||id AS title
FROM
my_table;
Run Code Online (Sandbox Code Playgroud)
在Google中搜索几乎是不可能的!管道和封闭的引用冒号做什么?
我正在尝试为大型备份文件创建可读的日志文件.
在脚本中,我只是将命令的所有输出传递给一个大文件,然后可以通过脚本"清理".例如:
echo "Error occurred" >> log.file
mount disk >> log.file
Run Code Online (Sandbox Code Playgroud)
在执行脚本时,我错过了警告和错误,我在控制台管道.
backup.script >> log.file
Run Code Online (Sandbox Code Playgroud)
但即便如此,当我通过cron执行脚本(带管道)时,错误消息并不总是记录在我的文件中,我从rsync和脚本错误中收到邮件:
rsync: writefd_unbuffered failed to write 4 bytes to socket [sender]: Broken pipe (32)
rsync: write failed on "/mnt/backup1/xxxxx": No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(322) [receiver=3.0.9]
rsync: connection unexpectedly closed (215 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(605) [sender=3.0.9]
Run Code Online (Sandbox Code Playgroud)
并在发生脚本错误时:
/data/scripts/backup.auto: line 320: syntax error …Run Code Online (Sandbox Code Playgroud) 试图澄清我对fork()和pipe()的理解.我知道pipe()是一种在两个进程之间传输数据的单向方法.如果在父进程中,我在两个整数数组上调用pipe(),然后我将它分叉,这是否有效地创建了两个允许我双向传输数据的管道?(即让父母从标准中读取并且孩子写入标准输出,或者类似地让父母写入标准输出并且孩子从标准中读取?)