小编cod*_*ter的帖子

yum update 与 yum install 的区别

在使用该rpm命令时,我注意到如果我安装some-package-1.0然后执行另一个rpm -ivh some-package-1.1包,当我执行rpm -qa | grep some-package以下操作时,将列出两个包:

some-package-1.0
some-package-1.1
Run Code Online (Sandbox Code Playgroud)

但是,如果我通过 升级,而不是安装 1.1,rpm -Uvh some-package-1.1当我执行rpm -qa | grep some-package.

现在相同的行为是否适用于yum installyum update

我问是因为使用rpm -U(upgrade) 命令升级/安装包不一定要存在,但是yum update(如果我没记错的话)包必须已经存在。

我特别想知道使用它们的版本指定包的结果,例如some-package-1.0. 总而言之,我想知道的是我是否有两个特定版本,例如some-package-1.0some-package-1.1

  1. 是否yum install在 1.0 已经安装后在 1.1 上执行 a ,列出 2 个包?
  2. 运行yum update some-package-1.1成功会替换some-package-1.0吗?

yum rpm

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

类型(Bash 内置函数)的用途是什么?

我在 Bash 脚本中遇到了一个命令,其中发现:

find /var/log/abcd -type f
Run Code Online (Sandbox Code Playgroud)

上面的命令是在清理日志文件的上下文中。我知道有什么find作用。

看过之后-type f,我查看了它的手册页。我必须在BASH_BUILTINS(1) 的手册页中看到它

type命令下 -f 标志的描述是:-

The -f option suppresses shell function lookup, as with the command builtin.
Run Code Online (Sandbox Code Playgroud)

以下是我的问题:

  1. 有什么用type
  2. -f国旗的意义是什么?
  3. using typewithfind命令有什么用?

[编辑]:-在阅读了到目前为止的所有评论和答案之后,我想提一下我对-type option in command findVs 的误解的原因type command。这一切都发生了,因为我一直假设直到日期只看到find带有单个减号 '-'的短选项(在命令的情况下测试),例如,ls -l. 大多数情况下,我看到带有双减号 '--' 的长选项,例如ls --version.

bash shell-script

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

如何在 Red Hat 上安装/删除/升级 .rpm 软件包?

我需要安装运行 Red Hat 的虚拟机中缺少的软件包。我怎么做?

我应该使用什么命令来安装/删除/升级 .rpm 包?

command-line rpm rhel software-installation

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

如何找出已安装库的版本号?

与 RedHat/CentOS 相关的问题。我对包和库以及如何将它们固定到固定版本之间有点困惑。

在最近的 libxcb 版本中有一个 X11 翻转错误会影响我的 C 程序。libxcb-1.5-1 没有那个错误。

所以我做了:

# yum remove libxcb-devel
# rpm -Uvh --oldpackage libxcb-1.5-1.el6.i686.rpm 
Run Code Online (Sandbox Code Playgroud)

现在错误消失了,我的软件运行良好。

快进几周,错误又回来了。

# yum info libxcb-devel
Loaded plugins: refresh-packagekit, security
Available Packages
Name       : libxcb-devel
Arch       : i686
Version    : 1.9.1
Release    : 2.el6
Size       : 1.0 M
Repo       : sl-security
Run Code Online (Sandbox Code Playgroud)

但是是安装的版本还是通过 repo 可用的版本?我如何知道当前安装的是哪个版本的 libxcb?

$ ll /usr/lib/libxcb.so*
lrwxrwxrwx 1 root root     15 Aug  6 03:38 /usr/lib/libxcb.so.1 -> libxcb.so.1.1.0*
-rwxr-xr-x 1 root root 130752 Oct 14  2014 /usr/lib/libxcb.so.1.1.0*
$ …
Run Code Online (Sandbox Code Playgroud)

yum rhel shared-library

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

删除 bash 中的前导字符串

我有一个像这样的字符串rev00000010,我只想要最后一个数字,在这种情况下是 10。

我试过这个:

TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'
Run Code Online (Sandbox Code Playgroud)

两者都没有返回,尽管正则表达式似乎是正确的(用regexr尝试

sed regular-expression

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

测试 shell 对数组的支持

是否有一种简洁的方法可以在命令行中测试本地类似 Bourne 的 shell 对数组的支持?

这总是可能的:

$ arr=(0 1 2 3);if [ "${arr[2]}" != 2 ];then echo "No array support";fi
Run Code Online (Sandbox Code Playgroud)

或测试$SHELL和外壳版本:

$ eval $(echo "$SHELL --version") | grep version
Run Code Online (Sandbox Code Playgroud)

然后阅读手册页,假设我可以访问它。(即使在那里,从写/bin/bash,我假设所有类似Bourne外壳承认的长选项--version,当减免KSH例如)。

我正在寻找一个简单的测试,它可以无人参与,并在脚本开始时甚至在调用它之前合并到使用部分中。

shell array shell-script

13
推荐指数
2
解决办法
1917
查看次数

在 Bash 中使用 su 运行多个命令

我想使用su -c以 root 身份运行多个命令。我不想为此使用额外的脚本。

我尝试了以下方法:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & " -c "ls -lh"
Run Code Online (Sandbox Code Playgroud)

但它只执行ls不是第一个。

我尝试了以下方法:

su root -c "tcpdump -i wlan0 -s 1500 -w CCCCCC & ; ls -lh;"
Run Code Online (Sandbox Code Playgroud)

但它说分号有错误;

你知道怎么做吗?

bash su

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

评估 $BASH_COMMAND 是否安全?

我正在开发一个从变量构造复杂命令的 shell 脚本,例如这样(使用我从 Bash FAQ 中学到的技术):

#!/bin/bash

SOME_ARG="abc"
ANOTHER_ARG="def"

some_complex_command \
  ${SOME_ARG:+--do-something "$SOME_ARG"} \
  ${ANOTHER_ARG:+--with "$ANOTHER_ARG"}
Run Code Online (Sandbox Code Playgroud)

如果定义了这些变量,此脚本会动态添加参数--do-something "$SOME_ARG"和添加--with "$ANOTHER_ARG"some_complex_command。到目前为止,这工作正常。

但是现在我还希望能够在我运行时打印或记录命令,例如当我的脚本在调试模式下运行时。因此,当我的脚本运行时some_complex_command --do-something abc --with def,我还希望将此命令放在一个变量中,以便我可以将它记录到系统日志中。

Bash FAQ 演示了为此目的使用DEBUG陷阱和$BASH_COMMAND变量(例如用于调试目的)的技术。我已经尝试过使用以下代码:

#!/bin/bash

ARG="test string"

trap 'COMMAND="$BASH_COMMAND"; trap - DEBUG' DEBUG
echo "$ARG"

echo "Command was: ${COMMAND}"
Run Code Online (Sandbox Code Playgroud)

这有效,但它不会扩展命令中的变量:

host ~ # ./test.sh
test string
Command was: echo "$ARG"
Run Code Online (Sandbox Code Playgroud)

我想我必须使用 eval 扩展echo "$ARG"echo test string(至少我还没有找到没有的方法eval …

bash

11
推荐指数
2
解决办法
2378
查看次数

带有 `getopts` 的 Bash 函数仅在第一次运行时有效

f根据此处的示例(在“带参数的选项”下)在 Bash 中定义了该函数:

f () {
  while getopts ":a:" opt; do
    case $opt in
      a)
        echo "-a was triggered, Parameter: $OPTARG" >&2
        ;;
      \?)
        echo "Invalid option: -$OPTARG" >&2
        return 1
        ;;
      :)
        echo "Option -$OPTARG requires an argument." >&2
        return 1
        ;;
    esac
  done
}
Run Code Online (Sandbox Code Playgroud)

虽然他们使用脚本,但我直接在 shell 中定义函数。

当我第一次启动 Bash 并定义函数时,一切正常:f -a 123prints -a was triggered, Parameter: 123。但是当我第二次运行完全相同的行时,没有打印任何内容

是什么导致了这种行为?它发生在 Bash 3.2 和 4.3 中,但它在 Zsh 5.1 中工作正常。这令人惊讶,因为该示例应该用于 Bash,而不是用于 Zsh。

bash function getopts

11
推荐指数
2
解决办法
9778
查看次数

删除所有在分隔符前没有 n 个字符的行

我有一个很长的文本文件(从这里开始),它应该包含 6 个十六进制字符,然后是一个“中断”(它显示为一个字符,似乎没有在下面的代码降价中正确显示),然后是几个单词:

00107B  Cisco Systems, Inc
00906D  Cisco Systems, Inc
0090BF  Cisco Systems, Inc
5080    Cisco Systems, Inc
0E+00   ASUSTek COMPUTER INC.
000C6E  ASUSTek COMPUTER INC.
001BFC  ASUSTek COMPUTER INC.
001E8C  ASUSTek COMPUTER INC.
0015F2  ASUSTek COMPUTER INC.
2354    ASUSTek COMPUTER INC.
001FC6  ASUSTek COMPUTER INC.
60182E  ShenZhen Protruly Electronic Ltd co.
F4CFE2  Cisco Systems, Inc
501CBF  Cisco Systems, Inc
Run Code Online (Sandbox Code Playgroud)

我已经环顾四周,但看不到在这种情况下可以工作的东西。我的问题是,我该如何使用grep/ sed/ awk/perl删除不与刚好6个十六进制字符,然后一个“破”启动这个文本文件中的所有行?

PS 对于加分,根据十六进制字符(即000000-> FFFFFF)按字母顺序和数字顺序对文件进行排序的最佳方法是什么?我应该使用sort吗?

grep sed text-processing text-formatting

11
推荐指数
2
解决办法
444
查看次数