小编jwb*_*ley的帖子

有效地检查几个命令的Bash退出状态

是否有类似于pipefail的多个命令,比如'try'语句但在bash中.我想做这样的事情:

echo "trying stuff"
try {
    command1
    command2
    command3
}
Run Code Online (Sandbox Code Playgroud)

并且在任何时候,如果任何命令失败,则退出并回显该命令的错误.我不想做以下事情:

command1
if [ $? -ne 0 ]; then
    echo "command1 borked it"
fi

command2
if [ $? -ne 0 ]; then
    echo "command2 borked it"
fi
Run Code Online (Sandbox Code Playgroud)

等等......或类似的东西:

pipefail -o
command1 "arg1" "arg2" | command2 "arg1" "arg2" | command3
Run Code Online (Sandbox Code Playgroud)

因为我相信的每个命令的参数(如果我错了,纠正我)会相互干扰.这两种方法对我来说似乎非常啰嗦和讨厌,所以我在这里呼吁采用更有效的方法.

bash exit

252
推荐指数
9
解决办法
37万
查看次数

Grep正则表达式不包含字符串

我正在传递一个正则表达式模式列表grep来检查syslog文件.它们通常匹配IP地址和日志条目;

grep "1\.2\.3\.4.*Has exploded" syslog.log
Run Code Online (Sandbox Code Playgroud)

它只是一个模式列表,比如"1\.2\.3\.4.*Has exploded"我传递的部分,在一个循环中,所以我不能传递"-v"例如.

我很困惑,试图做上面的逆,一个NOT匹配线与某个IP地址和错误所以"!1.2.3.4.*已爆炸"将匹配系统日志行除1.2.3.4以外的任何东西告诉我它已爆炸.我必须能够包含一个不匹配的IP.

我在StackOverflor上看过各种类似的帖子,但是他们使用了我似乎无法使用的正则表达式模式grep.有人可以提供一个工作示例grep吗?

更新: 这发生在这样的脚本中;

patterns[1]="1\.2\.3\.4.*Has exploded"
patterns[2]="5\.6\.7\.8.*Has died"
patterns[3]="\!9\.10\.11\.12.*Has exploded"

for i in {1..3}
do
 grep "${patterns[$i]}" logfile.log
done
Run Code Online (Sandbox Code Playgroud)

regex grep

162
推荐指数
3
解决办法
22万
查看次数

将制表符分隔的文件行读入数组

我想逐行将文件读入脚本.文件中的每一行都是由制表符分隔的多个值,我想将每一行读入一个数组.

典型的bash"逐行读取"示例;

while read line
do
echo $line;
done < "myfile"
Run Code Online (Sandbox Code Playgroud)

对我来说,myfile看起来像这样(制表符分隔值);

value1 value2 value3
value4 value5 value6
Run Code Online (Sandbox Code Playgroud)

在循环的每次迭代中,我希望每一行都进入一个数组,所以我可以

while read line into myArray
do
 echo myArray[0]
 echo myArray[1]
 echo myArray[2]
done < "myfile"
Run Code Online (Sandbox Code Playgroud)

这将在第一次循环迭代中打印以下内容;

value1
value2
value3
Run Code Online (Sandbox Code Playgroud)

然后在第二次迭代它将打印

value4
value5
value6
Run Code Online (Sandbox Code Playgroud)

这可能吗?我能看到的唯一方法是编写一个小函数来手动打破这些值,是否内置了对bash的支持?

arrays bash

59
推荐指数
2
解决办法
10万
查看次数

除以两个整数以产生浮点结果

可能重复:
为什么我不能从被分割的两个整数中返回一个双精度数

即使我尝试将输出放入浮点数,我的C++程序也会截断整数分割的输出.如何在保持变量(a和b)为整数的同时防止这种情况?

user@box:~/c/precision$ cat precision.cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int a = 10, b = 3;
  float ans = (a/b);
  cout<<fixed<<setprecision(3);
  cout << (a/b) << endl;
  cout << ans << endl;
  return 0;
}

user@box:~/c/precision$ g++ -o precision precision.cpp 
user@box:~/c/precision$ ./precision 
3
3.000
Run Code Online (Sandbox Code Playgroud)

c++ precision integer-division

51
推荐指数
1
解决办法
15万
查看次数

变形代码示例

我理解多态变形代码的概念,但我最近阅读了两者的维基百科页面(因为我之前没有做过这个原因!).现在我真的想为自己编写一些变形代码.

我是一个没有语言的大师,很多人.我知道一些PHP,MySQL,c/c ++,Java,Bash脚本,Visual Basic 6,VBScripting,Perl,JavaScript.

任何人都可以提供任何这些语言的变形代码示例.我希望看到一个有效的例子,即使程序的输出只是"Hello World",也要通过例子来理解这是如何发生的(我正在努力理解这些技术如何通过心理思维来实现).任何语言都可以做到,这些只是首选语言.

此外,搜索互联网只返回了c/c ++中的有限数量的示例(甚至不是完整的工作示例,更多的部分代码片段),因为我所建议的其他语言不够低,没有足够的功能/变形代码所需的灵活性?

polymorphism

35
推荐指数
2
解决办法
2万
查看次数

Android后退按钮和进度对话框

我有一个的AsyncTask,显示了progressDialog同时工作(它调用runOnUiThread从内部doInBackground显示进度对话框).

在运行时,我想允许使用后退按钮来取消操作; 其他人遇到此问题:当ProgressDialog正在运行时,BACK按钮不起作用

因为什么原因我不能回复那个帖子,因此不得不开始另一个?!(另一天的另一个问题)

我和Sandy有同样的想法,但是在progressDialog显示时,这段代码从未被调用过,为什么会这样?我已经在我的主要活动类中实现了它,progressDialog是否暂时将我的前景焦点从我的课程中移开?

android dialog progress button back

34
推荐指数
5
解决办法
4万
查看次数

使用PACKET_MMAP和PACKET_TX_RING发送数据比"正常"(没有)慢

我正在使用PACKET_MMAP套接字选项在C中编写流量生成器来创建环形缓冲区以通过原始套接字发送数据.环形缓冲区充满了以太网帧以进行发送和sendto调用.环形缓冲区的全部内容通过套接字发送,这应该比在内存中具有缓冲区提供更高的性能,并且sendto对于需要发送的缓冲区中的每个帧重复调用.

当不使用PACKET_MMAP时,在调用单帧时,sendto从用户区内存中的缓冲区复制到内核内存中的SK buf,然后内核必须将数据包复制到NIC访问的内存中,并将NIC发送到DMA将帧放入其自己的硬件缓冲区并将其排队以进行传输.当使用PACKET_MMAP套接字选项时,mmapped内存由应用程序分配并链接到原始套接字.应用程序将数据包放入mmapped缓冲区,调用sendto而不是内核必须将数据包复制到SK buf中,它可以直接从mmapped缓冲区中读取它们.还可以从环形缓冲区而不是单独的分组/帧读取分组的"块".因此,性能提升是一个系统调用,用于复制多个帧,每个帧一次复制操作,以使其进入NIC硬件缓冲区.

当我将使用PACKET_MMAP的套接字的性能与"普通"套接字(其中包含单个数据包的char缓冲区)进行比较时,根本没有性能优势.为什么是这样?在Tx模式下使用PACKET_MMAP时,每个环形块只能放入一个帧(而不是像Rx模式那样每个环形块有多个帧)但是我创建了256个块,所以我们应该在一次sendto调用中发送256帧吗?

使用PACKET_MMAP进行性能main()调用packet_tx_mmap():

bensley@ubuntu-laptop:~/C/etherate10+$ sudo taskset -c 1 ./etherate_mt -I 1
Using inteface lo (1)
Running in Tx mode
1. Rx Gbps 0.00 (0) pps 0   Tx Gbps 17.65 (2206128128) pps 1457152
2. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.08 (2385579520) pps 1575680
3. Rx Gbps 0.00 (0) pps 0   Tx Gbps 19.28 (2409609728) pps 1591552
4. Rx Gbps 0.00 …
Run Code Online (Sandbox Code Playgroud)

c sockets performance network-programming circular-buffer

22
推荐指数
1
解决办法
4384
查看次数

当我查询模式时,MySQL给出了波动的行数?

在这里,我在我的笔记本电脑上的dev DB上按下并运行相同的命令,一遍又一遍;

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.42 sec)

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.35 sec)

mysql> select count(*) from tblTraceOutput;
+----------+
| count(*) |
+----------+
|   300175 |
+----------+
1 row in set (0.45 sec)
Run Code Online (Sandbox Code Playgroud)

在这里,我正在做同样的事情,按'向上'并再次运行最后一个命令,但输出是chaning.这里发生了什么?没有什么可以使用这个数据库,因为它是我本地笔记本电脑上的副本,用于我自己的修修补补.为什么表格的行数会发生变化tblTraceOutput

mysql> SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'smoketrace';
+----------------+------------+
| table_name     | table_rows …
Run Code Online (Sandbox Code Playgroud)

mysql

20
推荐指数
3
解决办法
9189
查看次数

计算两个数字之间差异的最短方法?

我将在C++中这样做,但我不得不用几种语言来做,这是一个相当普遍和简单的问题,这是最后一次.我已经足够像我一样对它进行编码了,我确信必须有一个更好的方法,所以在我用另一种语言写出相同的长卷曲方法之前我在这里发帖;

考虑下面代码的(百合!);

// I want the difference between these two values as a positive integer
int x = 7
int y = 3
int diff;
// This means you have to find the largest number first 
// before making the subtract, to keep the answer positive
if (x>y) { 
     diff = (x-y);
} else if (y>x) {
     diff = (y-x);
} else if (x==y) {
    diff = 0;
}
Run Code Online (Sandbox Code Playgroud)

这可能听起来很小,但这对我来说似乎很重要,只是为了得到两个数字之间的区别.这实际上是一种完全合理的做事方式,我是不必要的迂腐,还是我的狡猾感觉有充分的理由刺痛?

c++ math

17
推荐指数
4
解决办法
5万
查看次数

Linux:发送以太网帧时,正在重写ethertype

我编写了一个C程序,它将以太网帧直接写入线路(以两种模式运行,发送器或接收器).发送方正在发送带有两个VLAN标记的帧(QinQ),但奇怪的是,当帧到达接收方时,ethertype已更改为标准(单个)VLAN封装帧的类型.NIC是否有可能这样做,或者Linux不允许这样做?Wireshark显示与tcpdump相同的行为.

为了解释下面的图像,发送器正在向以太网广播地址FF:FF:FF:FF:FF:FF发送帧以找到接收器(这些是通过交叉电缆连接的两台测试机,但下面的结果与开关或集线器).正如您所看到的那样,帧上有两个VLAN标记,外部标记的ethertype为0x8100,VLAN ID为40,内部VLAN的ethertype为0x8100,VLAN ID为20.我们都知道,使用QinQ帧时,外框应该具有0x88a8的ethertype!

当在我的应用程序中从发送方发送帧时,它们的外部ethertype为0x88a8,但根据下图,它们在内部和外部ethertypes上都接收到0x8100.突出显示的文本是接收者发送回复,因为您可以看到帧在外框上有0x88a8,在内部有0x8100.另一台机器上的tcpdump显示相同的内容(它是相同的代码!帧内部发送0x88a8外部0x8100但总是接收为0x8100外部和0x8100内部).

在此输入图像描述

void BuildHeaders(char* &txBuffer, unsigned char (&destMAC)[6], 
     unsigned char (&sourceMAC)[6], short &PCP, short &vlanID,
     short &qinqID, short &qinqPCP, int &headersLength)
{

int offset = 0;

short TPI = 0;
short TCI = 0;
short *p = &TPI;
short *c = &TCI;
short vlanIDtemp;

// Copy the destination and source MAC addresses
memcpy((void*)txBuffer, (void*)destMAC, ETH_ALEN);
memcpy((void*)(txBuffer+ETH_ALEN), (void*)sourceMAC, ETH_ALEN);
offset = (ETH_ALEN*2);

// Add on the QinQ Tag Protocol Identifier
vlanIDtemp = qinq
TPI = htons(0x88a8); …
Run Code Online (Sandbox Code Playgroud)

c linux raw-ethernet

7
推荐指数
1
解决办法
7806
查看次数