是否有类似于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)
因为我相信的每个命令的参数(如果我错了,纠正我)会相互干扰.这两种方法对我来说似乎非常啰嗦和讨厌,所以我在这里呼吁采用更有效的方法.
我正在传递一个正则表达式模式列表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) 我想逐行将文件读入脚本.文件中的每一行都是由制表符分隔的多个值,我想将每一行读入一个数组.
典型的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的支持?
可能重复:
为什么我不能从被分割的两个整数中返回一个双精度数
即使我尝试将输出放入浮点数,我的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) 我理解多态和变形代码的概念,但我最近阅读了两者的维基百科页面(因为我之前没有做过这个原因!).现在我真的想为自己编写一些变形代码.
我是一个没有语言的大师,很多人.我知道一些PHP,MySQL,c/c ++,Java,Bash脚本,Visual Basic 6,VBScripting,Perl,JavaScript.
任何人都可以提供任何这些语言的变形代码示例.我希望看到一个有效的例子,即使程序的输出只是"Hello World",也要通过例子来理解这是如何发生的(我正在努力理解这些技术如何通过心理思维来实现).任何语言都可以做到,这些只是首选语言.
此外,搜索互联网只返回了c/c ++中的有限数量的示例(甚至不是完整的工作示例,更多的部分代码片段),因为我所建议的其他语言不够低,没有足够的功能/变形代码所需的灵活性?
我有一个的AsyncTask,显示了progressDialog同时工作(它调用runOnUiThread从内部doInBackground显示进度对话框).
在运行时,我想允许使用后退按钮来取消操作; 其他人遇到此问题:当ProgressDialog正在运行时,BACK按钮不起作用
因为什么原因我不能回复那个帖子,因此不得不开始另一个?!(另一天的另一个问题)
我和Sandy有同样的想法,但是在progressDialog显示时,这段代码从未被调用过,为什么会这样?我已经在我的主要活动类中实现了它,progressDialog是否暂时将我的前景焦点从我的课程中移开?
我正在使用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) 在这里,我在我的笔记本电脑上的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) 我将在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程序,它将以太网帧直接写入线路(以两种模式运行,发送器或接收器).发送方正在发送带有两个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)