小编Eri*_*ouf的帖子

为什么最好使用“#!/usr/bin/env NAME”而不是“#!/path/to/NAME”作为我的shebang?

我注意到我从其他人那里获得的一些脚本有 shebang#!/path/to/NAME而其他人(使用相同的工具,NAME)有 shebang #!/usr/bin/env NAME

两者似乎都可以正常工作。在教程中(例如在 Python 上),似乎有人建议后者 shebang 更好。但是,我不太明白为什么会这样。

我意识到,为了使用后一个 shebang,NAME 必须在 PATH 中,而第一个 shebang 没有这个限制。

此外,(对我而言)第一个似乎是更好的shebang,因为它精确地指定了NAME 所在的位置。因此,在这种情况下,如果 NAME 有多个版本(例如,/usr/bin/NAME、/usr/local/bin/NAME),第一种情况指定使用哪个。

我的问题是为什么第一个shebang比第二个更受欢迎?

shell-script shebang

588
推荐指数
10
解决办法
25万
查看次数

提取与“sed”匹配的正则表达式而不打印周围的字符

致所有的“sed”医生:

你怎么能得到'sed'来提取它在一行中匹配的正则表达式?

换句话说,我只想要与正则表达式相对应的字符串,其中包含行中的所有非匹配字符都被剥离。

我尝试使用如下所示的反向引用功能

regular expression to be isolated 
         gets `inserted` 
              here     
               |
               v  
 sed -n 's/.*\( \).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

这适用于某些表达式,例如

 sed -n 's/.*\(CONFIG_[a-zA-Z0-9_]*\).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

它巧妙地提取了所有以 'CONFIG_ ....' 开头的宏名称(在某些 '*.h' 文件中找到)并逐行打印出来

          CONFIG_AT91_GPIO
          CONFIG_DRIVER_AT91EMAC
                   .
                   .   
          CONFIG_USB_ATMEL
          CONFIG_USB_OHCI_NEW
                   .
                 e.t.c. 
Run Code Online (Sandbox Code Playgroud)

但是上面的内容分解为类似的东西

  sed -n 's/.*\([0-9][0-9]*\).*/\1/p 
Run Code Online (Sandbox Code Playgroud)

这总是返回个位数,如

                 7
                 9
                 .
                 .  
                 6
Run Code Online (Sandbox Code Playgroud)

而不是提取连续的数字字段,例如。

              8908078
              89670890  
                 .
                 .  
                 .
               23019   
                 .
               e.t.c.  
Run Code Online (Sandbox Code Playgroud)

PS:我将非常感谢关于如何在“sed”中实现这一点的反馈。我知道如何使用“grep”和“awk”来做到这一点我想知道我对“sed”的理解(尽管有限)是否有漏洞,以及是否有办法在我
拥有的“sed”中做到这一点简直被忽视了。

sed

27
推荐指数
3
解决办法
6万
查看次数

如何仅使用grep打印第一个匹配项

我正在尝试 grep 用户名:

users | grep "^\b\w*\b" -P
Run Code Online (Sandbox Code Playgroud)

我怎样才能让它只显示第一场比赛grep

shell grep regular-expression

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

如何检查端口 25 是打开还是阻塞?

我正在尝试确定服务器上的端口 25 是否可用。我尝试使用nctelnet进行连接,但每个都无法连接。

我还能做其他测试来确定该端口上是否有任何东西在监听吗?

linux ssh smtp centos

13
推荐指数
1
解决办法
8万
查看次数

原地呆呆和标准输出

是否可以使用gawk's-i inplace选项并将内容打印到stdout

例如,如果我想更新一个文件,并且如果有任何更改,则将文件名和更改后的行打印到stderr我可以执行以下操作

find -type f -name 'myfiles' -exec gawk -i inplace '{if(gsub(/pat/, "repl")) { print FILENAME > "/proc/self/fd/2" ; print > "/proc/self/fd/2"; } print;}' {} +
Run Code Online (Sandbox Code Playgroud)

但是有没有办法使用stdout,或者更简洁的方式将该块打印到备用流?

awk gawk

10
推荐指数
1
解决办法
979
查看次数

递归查找空目录

我怎样才能找到每个空目录,比如说,在 /home/.../Desktop 上。因为我在 Solaris 上,所以无法使用该find . -empty -type d命令。有没有其他办法?

solaris directory find

8
推荐指数
1
解决办法
3536
查看次数

如何使用 sudo -u 选项?

我有 2 个用户,userA 和 userB。userB 需要以 userA 的身份运行一些命令。我在/etc/sudoers下面指定了这些选项:

userA ALL=(ALL) ALL
userB ALL=(vinoth) /sbin/fdisk
Run Code Online (Sandbox Code Playgroud)

我以 userB 身份运行此命令:

sudo -u userA fdisk -l 
Run Code Online (Sandbox Code Playgroud)

它要求输入用户 B 的密码。一旦我输入了密码,该命令就没有给出 fdisk 输出。

sudo fdisk

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

限制某些接口/网络之间的 IP 转发

我目前已ipv4.ip_forward启用在多个接口之间路由数据包。

我现在将系统扩展到 8 个接口,但我想限制接口/地址之间的路由。

一种选择是使用firewalld,但我将其部署在较旧版本的 RH 上,因此将通过iptables.

linux iptables forwarding

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

没有密码的 Sudo 特定命令

我有以下条目/etc/sudoers允许我在询问密码后运行任何命令

%sudo   ALL=(ALL:ALL) ALL
Run Code Online (Sandbox Code Playgroud)

我还想在脚本中运行一个没有密码的特定命令。我试过将以下行放在 中/etc/sudoers,但它在我运行时总是要求输入密码。

gmc ALL = NOPASSWD: /sbin/hdparm -C /dev/sdc
Run Code Online (Sandbox Code Playgroud)

有没有办法sudo在使用通用条目之前使用特定命令?

sudo

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

如何 grep 查找 = 符号后的值

如何指定 grep 来查找所有可能的值

即,使用如下文件(9701可以是任何值):

9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps
Run Code Online (Sandbox Code Playgroud)

我可以尝试

egrep -Eo '9701=[A-Z]+[a-z]+[0-9]{1,50}' test.log
Run Code Online (Sandbox Code Playgroud)

这只给我大写/小写和数字值。如何在 grep 请求中包含带有特殊字符的值?即,带有空格、点、连字符、下划线等。

grep regular-expression

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