小编Sco*_*ott的帖子

如何正确添加路径到PATH?

我想知道必须向PATH环境变量添加新路径的位置。我知道这可以通过编辑来完成.bashrc(例如),但不清楚如何做到这一点。

这边走:

export PATH=~/opt/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

或这个?

export PATH=$PATH:~/opt/bin
Run Code Online (Sandbox Code Playgroud)

bash path environment-variables bashrc

1174
推荐指数
11
解决办法
278万
查看次数

如何在不修改文件的情况下测试文件是使用 CRLF 还是 LF?

我需要定期运行一个命令,以确保某些文本文件保持在 Linux 模式下。不幸的是dos2unix总是修改文件,这会弄乱文件和文件夹的时间戳并导致不必要的写入。

我编写的脚本是用 Bash 编写的,所以我更喜欢基于 Bash 的答案。

bash text-processing newlines

77
推荐指数
9
解决办法
14万
查看次数

管道 xargs 后的管道命令

HP-UX ***** B.11.23 U ia64 **** 无限制用户许可证

find . -type d -name *log*?|?xargs ls -la
Run Code Online (Sandbox Code Playgroud)

给我目录名称(包含log在目录名称中的名称),后跟该目录中的所有文件。

目录?/var/opt/SID/application_a/log/,?/var/opt/SID/application_b/log/,?/var/opt/SID/application_c/log/等等包含日志文件。

我只希望ls命令列出两个最新的日志文件,我通常使用ls -latr?|?tail -2.

输出必须是这样的..

find . -type d -name *log*?|?xargs ls -la
Run Code Online (Sandbox Code Playgroud)

find . -type d -name *log*?|?xargs ls -la?|?tail -2没有给我上面的结果。我得到的是最后两个find . -type d -name *log*?|?xargs ls -la命令文件的列表 。

那么我可以在管道之后管道命令xargs吗?我如何查询,以获取上述格式的结果文件列表?

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun …
Run Code Online (Sandbox Code Playgroud)

shell pipe find xargs

58
推荐指数
3
解决办法
10万
查看次数

条件管道

假设我有以下管道:

cmd1 < input.txt |\
cmd2 |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt
Run Code Online (Sandbox Code Playgroud)

在某些条件下,我想cmd3cmd2和之间添加一个cmd4。有没有办法创建一种条件管道而不将结果保存cmd2到临时文件中?我会想到这样的事情:

cmd1 < input.txt |\
cmd2 |\
(${DEFINED}? cmd3 : cat ) |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt
Run Code Online (Sandbox Code Playgroud)

shell pipe shell-script

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

如何将 stdout 重定向到一个文件,并将 stdout+stderr 重定向到另一个文件?

我怎样才能达到

cmd >> file1 2>&1 1>>file2
Run Code Online (Sandbox Code Playgroud)

也就是说,stdoutstderr 应该重定向到一个文件吗?(file1) 而只有 stdout?(file2) 应该重定向到另一个(都在附加模式下)?

shell io io-redirection stdout stderr

34
推荐指数
2
解决办法
6386
查看次数

如何减少AWK中正则表达式的贪婪?

我想在awk. 下面是一个例子:

echo "@article{gjn, Author =   {Grzegorz J. Nalepa}, " | awk '{ sub(/@.*,/,""); print }'
Run Code Online (Sandbox Code Playgroud)

是否可以编写一个选择较短字符串的正则表达式?

@article{gjn,
Run Code Online (Sandbox Code Playgroud)

而不是这个长字符串?:

@article{gjn, Author =   {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)

我想得到这个结果:

 Author =   {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)



我还有一个例子:

echo " ,文章{gjn, Author = {Grzegorz J. Nalepa}, " | awk '{ sub(/ , [^,]*,/,""); 打印 }'
      ? ?^^^^^

请注意,我将输入字符串和正则表达式的第一个位置中的@字符更改为逗号 ( ,) 字符(也更改.*[^,]*)。是否可以编写一个选择较短字符串的正则表达式?

, Author =   {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)

而不是更长的字符串?:

,article{gjn, Author =   {Grzegorz J. Nalepa},
Run Code Online (Sandbox Code Playgroud)

我想得到这个结果:

,article{gjn
Run Code Online (Sandbox Code Playgroud)

awk regular-expression

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

dig 如何找到我的 WAN-IP 地址?“myip.opendns.com”在做什么?

我需要从我的路由器自动获取我自己的 WAN-IP 地址。我发现了这个问题dig并提出了一个解决方案:

dig +short myip.opendns.com @resolver1.opendns.com
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但现在我想了解它在做什么。这是我(希望)到目前为止所理解的(如果我错了,请纠正我):

  • +short 只是给我一个简短的输出
  • @resolver1.opendns.com 是 DNS 服务器,它被询问属于给定域的 IP 地址

我不清楚的是myip.opendns.com。如果我改写www.spiegel.de,我会得到域www.spiegel.de的 IP 地址,对吗?随着myip.opendns.com我得到我的路由器的广域网IP。那么myip.opendns.com只是模拟一个解析到我的路由器的域吗?它是如何做到的?它从哪里获得我的 IP?它与诸如www.wieistmeineip.de 之类的网页有何不同?他们还试图获取我的 IP。

在Krinkle 对我提到的问题的回答中,据说这种“dns-approach”会比“http-approach”更好。为什么它更好,有什么区别?

必须有所不同,因为我从dig +short myip.opendns.com @resolver1.opendns.com(ip1)获得的 WAN-IP是我也可以在路由器的 Web 界面中看到的那个,而www.wieistmeineip.de(以及其他类似站点)给了我另一个 IP 地址 (ip2) . 我可以想象我的 ISP 正在使用某种子局域网,因此我对网络服务器的请求通过另一个具有 ip2 的(ISP-)路由器,所以它www.wieistmeineip.de只是看到这个地址(ip2)。但是,再一次,那又myip.opendns.com在做什么呢?

另外:从我的 LAN 内打开 ip1 给了我来自我的 RasPi 的测试网站,从我的 LAN 外部(移动互联网)打开它不起作用。这是否意味着 ip1 不是正确的“互联网 IP”,而更像是 LAN IP?

dns dyndns dig

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

从一个硬盘驱动器复制到另一个硬盘驱动器后验证大目录

我有一个使用 Ubuntu 的家庭文件服务器。

最近,我的一个驱动器装满了,所以我又买了一个,把它扔进去了。

我有一个非常大的文件夹,该目录大小约为 1.7?T,并且包含相当数量的文件。

我使用GCP将文件从旧驱动器复制到新驱动器,它似乎运行良好。

我现在想在删除旧驱动器中的数据以释放空间之前,对照旧驱动器上的原始目录验证新驱动器上的新目录。我知道我可以做一个 CRC 检查来做到这一点。

具体怎么做呢?

ubuntu file-transfer file-copy files checksum

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

在输入第 3 行找不到要修补的文件

我使用diff上下文行数为 1(-c选项)的命令生成了一个补丁。我的补丁文件内容:

*** /home/sk/abc/def/src/klm/a.py 2015-05-18 16:25:50.348398554 +0530
--- /opt/abc/def/ghi/klm/a.py  2015-05-18 14:27:13.860503469 +0530
***************
*** 72,73 ****
--- 72,74 ----
              output, error, rCommand = "", "", ""
+             import subprocess
              rCommand = self.copyCmd % (self.executor_hostname, self.testId, self.testId)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这些命令应用补丁时,

cd /
patch -p0 < sg.patch
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出,

can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|*** /home/sk/abc/def/src/klm/a.py  2015-05-18 16:25:50.348398554 +0530
|--- …
Run Code Online (Sandbox Code Playgroud)

diff patch

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

了解 Bash 的 Read-a-File 命令替换

我试图了解 Bash 是如何处理以下行的:

$(< "$FILE")
Run Code Online (Sandbox Code Playgroud)

根据 Bash 手册页,这相当于:

$(cat "$FILE")
Run Code Online (Sandbox Code Playgroud)

我可以按照第二行的推理思路。Bash 对 执行变量扩展$FILE,进入命令替换,传递$FILEto的值cat,cat 将内容$FILE输出到标准输出,命令替换通过用内部命令产生的标准输出替换整行来完成,Bash 尝试执行它一个简单的命令。

但是,对于我上面提到的第一行,我理解为:Bash 在 上执行变量替换$FILE,Bash 打开$FILE以读取标准输入,以某种方式将标准输入复制到标准输出,命令替换完成,并且 Bash 尝试执行生成的标准输出。

有人可以向我解释如何$FILE从标准输入到标准输出的内容吗?

shell bash io-redirection command-substitution

14
推荐指数
3
解决办法
9947
查看次数