AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 791329
Accepted
user1169587
user1169587
Asked: 2025-02-20 12:09:38 +0800 CST2025-02-20 12:09:38 +0800 CST 2025-02-20 12:09:38 +0800 CST

命令替换和变量前的美元符号

  • 772

我有一个名为的文件,fileWithOneCommand.txt仅用以下命令命名,如下所示

ps -aux|head -n 5

然后我编写了一个名为'test5.sh'的测试shell脚本,内容如下:

file=/home/somepath/fileWithOneCommand.txt
$file;
echo see;
cat $file;
echo see2;
$(cat $file);
echo see3;

但我无法理解结果,结果如下:

$ ./test5.sh
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.1 168584 10308 ?        Ss   Feb19   0:49 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    Feb19   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    Feb19   0:00 [pool_workqueue_release]
root           4  0.0  0.0      0     0 ?        I<   Feb19   0:00 [kworker/R-rcu_g]
see
ps -aux|head -n 5
see2
error: user name does not exist

Usage:
 ps [options]

 Try 'ps --help <simple|list|output|threads|misc|all>'
  or 'ps --help <s|l|o|t|m|a>'
 for additional help text.

For more details see ps(1).
see3
  1. $file应该显示变量文件的内容,所以应该输出,
    ps -aux|head -n 5
    但为什么输出的是ps -aux|head -n 5的执行结果,而不是只显示ps -aux|head -n 5?

  2. cat $file; 返回 ps -aux|head -n 5,但是为什么

$(cat $file);

返回错误“错误:用户名不存在”?

当我在谷歌上搜索命令替换时,它说“命令的输出替换了命令本身。 Shell 通过执行命令然后用命令的标准输出替换命令替换来操作扩展。”

所以对于

$(cat $file);

括号里面,cat $file 返回 ps -aux|head -n 5 那么为什么$(cat $file);不返回 ps -aux|head -n 5 的执行结果,而是返回错误“error:用户名不存在”呢?

command-substitution
  • 1 1 个回答
  • 56 Views

1 个回答

  • Voted
  1. Best Answer
    grawity
    2025-02-20T13:54:00+08:002025-02-20T13:54:00+08:00

    shell 扩展的结果(无论是 $() 还是 $variable 甚至是反引号命令替换)不会经过“完整”的 shell 输入解析 - 只会进行单词拆分(我认为是通配符扩展)。在这个特定的例子中,如果结果包含|,它将不会被解析为管道运算符 - 它将保留为文字“|”。

    $ var='one two|three >four'
    
    $ ~/bin/args $var
    argc = 4
    argv[0] = args
    argv[1] = one
    argv[2] = two|three
    argv[3] = >four
    

    因此,整个扩展结果不再是两个命令ps -aux和,而是带有 3 个参数的单个命令:。head -n 5ps -aux|head -n 5"ps" "-aux|head" "-n" "5"

    Linuxps试图结合两种截然不同的命令行样式(BSD 和 SysV),并且同一个选项可能意味着两到三种不同的东西,具体取决于哪个“模式”ps猜测。例如,BSD 有-u,但 SysV 却有-u <username>,它的作用不同。

    在这种情况下,它首先尝试将第一个参数解释为 BSD 样式的选项-a -u -x -|...,但由于选项-|不存在,程序切换到 SysV 样式并-u接受一个参数。

    因此,其余部分x|head成为 SysV 选项的“用户名”参数-u,并且由于您的系统上不存在这样的用户帐户,因此您会收到错误消息。

    要强制完整解析字符串,您需要这样做eval。例如,eval "$mycmd"或eval "$(cat $myfile)"- 尽管后者最好写为. $myfile或source $myfile。


    该~/bin/args工具(bash 和 C 变体):

    #!/usr/bin/env bash
    for (( i = 0; i <= $#; i++ )); do
        echo "argv[$i] = ${!i}"
    done
    
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        printf("argc = %d\n", argc);
        for (int i = 0; i < argc; i++) {
            printf("argv[%d] = %s\n", i, argv[i]);
        }
        return 0;
    }
    
    • 0

相关问题

  • 什么问题/模式证明使用命令替换是合理的?

  • 打印包含换行符的变量时,为什么最后一个换行符被剥离?[复制]

  • 什么是 shell 中的命令替换?[复制]

  • 如何使 bash 替换 $(<"filename") 静音

  • 错误替换:heredoc / EOF 中没有关闭“`”

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve