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 / 问题

问题[command-substitution](unix)

Martin Hope
user1169587
Asked: 2025-02-20 12:09:38 +0800 CST

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

  • 5

我有一个名为的文件,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 个回答
  • 56 Views
Martin Hope
Saravana
Asked: 2025-02-04 04:13:53 +0800 CST

与 tput 一起使用的命令替换不打印任何内容

  • 5

我正在对 mint 20 进行代码研究,/lib/lsb/init-functions只是为了熟悉 SystemV init 系统。

其中有log_action_end_msg一个函数包含以下代码片段,

TPUT=/usr/bin/tput
if log_use_fancy_output; then
            RED=$( $TPUT setaf 1)  #=> Step 1
            NORMAL=$( $TPUT op)    #
            /bin/echo -e "${RED}failed${end}${NORMAL}" || true #=> Step 2
else
            echo "failed${end}" || true
fi

当变量RED被赋予值时$( $TPUT setaf 1 ),我期望 RED 被赋予一个空字符串,因为命令行上的 tput 运行不会打印任何内容。
但是,我看到变量被传递给 echo in,暗示它存储了一些东西。当 tput 不打印任何内容时,如何设置Step 2变量?RED

(或者)让我们把其他东西放在一边。拿一个新的终端,然后RED=$( $TPUT setaf 1)在我的终端上运行,我期望终端字体颜色设置为红色,但事实并非如此。只有当我这样做时echo $RED,它才会变成红色。

为什么 tput 命令没有在替换步骤期间运行,但是在调用时运行echo。

command-substitution
  • 1 个回答
  • 20 Views
Martin Hope
t7e
Asked: 2022-06-22 14:53:18 +0800 CST

回显/打印不带引号的 bash `ls` 命令替换 [重复]

  • 2
这个问题在这里已经有了答案:
为什么我的 shell 脚本会因空格或其他特殊字符而窒息? (6 个回答)
4 个月前关闭。

我有以下示例:

$ a="$(ls)"
$ echo $a
backups cache crash lib local lock log mail opt run snap spool tmp
$
$ echo "$a"
backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp

现在有了printf:

$ printf $a
backups
$
$ printf "$a"
backups
cache
crash
lib
local
lock
log
mail
opt
run
snap
spool
tmp

为什么输出如此不同?在这种情况下,引号会做什么?有人可以解释这里发生了什么吗?

PS 找到了一些关于该ls行为的解释:
ls 的输出有换行符,但显示在单行上。为什么?
https://superuser.com/questions/424246/what-is-the-magic-separator-between-filenames-in-ls-output
http://mywiki.wooledge.org/ParsingLs
换行符可以这样检查:

ls | od -c
bash command-substitution
  • 2 个回答
  • 148 Views
Martin Hope
ylluminate
Asked: 2022-06-01 10:34:32 +0800 CST

fish shell:为什么`file`which command`在zsh和bash中有效,但在fish中无效?

  • -1

在切换到 fish shell 之前,我经常在zshwith中使用各种命令which some_command。一个例子可能是:

$ file `which zsh`
/opt/local/bin/zsh: Mach-O 64-bit executable arm64
/bin/zsh:           Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64
- Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e
- Mach-O 64-bit executable arm64e]
/bin/zsh (for architecture x86_64): Mach-O 64-bit executable x86_64
/bin/zsh (for architecture arm64e): Mach-O 64-bit executable arm64e

当我尝试使用fish它失败时:

$ which zsh
/opt/local/bin/zsh

$ file `which zsh`
`which: cannot open ``which' (No such file or directory)
zsh`:   cannot open `zsh`' (No such file or directory)

fish知道为什么这与其他更像 bash 的 shell 相比不起作用吗?

fish command-substitution
  • 2 个回答
  • 208 Views
Martin Hope
TheGameiswar
Asked: 2022-04-18 08:57:42 +0800 CST

为什么 $(RANDOM) 与 $(ls -la) 的工作方式不同?

  • 0

对于 bash 中的命令替换,我们这样做

hello=$(ls -la)  
echo "$hello"

但是当我对以下命令执行相同操作时,它失败了,它说 RANDOM not found

hell=$(RANDOM)
echo "$hell"

我可以通过使用算术展开来克服它..

hell=$((RANDOM))
echo "$hell"

知道为什么下面不起作用...根据我的理解, RANDOM 也是一个命令,我应该得到数字回显

hell=$(RANDOM)
echo "$hell"
bash command-substitution
  • 1 个回答
  • 49 Views
Martin Hope
JohnnieL
Asked: 2022-04-15 10:53:42 +0800 CST

当命令替换结果为空时不运行命令

  • 3

我有以下代码可以pylint在带有文件扩展名的 Git 存储库中的所有文件上运行.py,由命令替换提供。

pylint $(git ls-files '*.py')

该脚本运行得很好,除非没有与该模式匹配的文件。但是,该pylint实用程序在没有文件的情况下被调用时会给出详细的帮助消息,这不是我想要的——我根本不想调用pylint。

那么,在调用之前,我能否就如何最好地测试是否有任何文件与文件名模式匹配寻求一些帮助pylint?

我是一个pylint新手bash。

bash command-substitution
  • 1 个回答
  • 57 Views
Martin Hope
NewLinux
Asked: 2022-01-14 05:29:07 +0800 CST

“命令替换”(Bash/Dash)中的命令顺序不正确

  • 0

为什么在运行替换命令时,执行顺序被破坏,如下例所示。首先chmod执行命令,echo 1然后echo 2?

echo $(echo 1; echo 2; chmod 444 nonexistent_file)

结果:

chmod: Cannot access 'nonexistent_file': No such file or directory
1 2
bash command-substitution
  • 1 个回答
  • 57 Views
Martin Hope
guest
Asked: 2022-01-11 08:21:14 +0800 CST

使用命令替换获取脚本时传递了错误的参数 [重复]

  • 0
这个问题在这里已经有了答案:
传递给源脚本的参数错误 3 个答案
9 个月前关闭。

我有一个脚本 print.sh:

#!/bin/bash
echo printing provided args:

for i in "$@"; do
        echo -e "\t${i}"
done

如果我在提示符下执行此操作,a=$(. print.sh ); echo "${a}" 那么我将获得printing provided args:存储的输出

我测试命令替换的主要脚本如下所示:

#!/bin/bash
function func_to_call_sub_scrp
        {
        # Call  sub-script
        capture="$(. $1  $2 $3)"
        echo -e "captured output:
\t\t${capture}"
        }

echo "Run function to call sub script without parameters passed. "
func_to_call_sub_scrp   print.sh
echo ""
echo "Run function to call sub script with parameters passed."
func_to_call_sub_scrp   print.sh     xx  yy

这输出:

Run function to call sub script without parameters passed. 
captured output:
                printing provided args:
        print.sh

Run function to call sub script with parameters passed.
captured output:
                printing provided args:
        xx
        yy

第二个调用将 xx 和 yy 发送到 print.sh,这与预期的一样。但是,当我发送“print.sh”“”“”命令替换调用 print.sh 并将它作为它的 $1 发送 print.sh 而不是发送它“”和“”

我的问题是,当没有其他输入时,如何将 $1 作为参数传递给打印脚本?我期望"$(. $1 $2 $3)"成为"$(. print.sh )"或"printing provided args:"曾经返回。

bash command-substitution
  • 1 个回答
  • 48 Views
Martin Hope
Erhannis
Asked: 2022-01-04 10:37:13 +0800 CST

反引号给出的结果与粘贴结果不同

  • 2

GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
Ubuntu 20.04.3 LTS

所以,我下载了大约 20 个 7z 文件,我想将它们移动到某个地方,但不是我在下载中已经拥有的以前的 7z 文件。(顺便说一句,文件名中也有一些空格。)所以我确实喜欢

mv `find -mmin -700 -iname "*.7z" -printf "\"%f\" "` ~/FOLDER/

它应该找到在过去 ~11 小时左右修改的所有 7z 文件,并将它们移动到 ~/FOLDER/.

它没有移动所有文件,而是给了我一堆带有文件名片段的错误,例如

mv: cannot stat 'Pinball': No such file or directory

我自己试过这个find命令,它给了我一个看起来合理的文件列表,每个文件都用引号括起来,都在一行上。我还尝试将find命令的输出粘贴到中mv PASTED_HERE ~/FOLDER/,就像我认为反引号基本上 DID 一样,并且效果很好。(我也试过$()用反引号代替,但我得到了与反引号相同的错误。)出了什么问题?

bash command-substitution
  • 1 个回答
  • 51 Views
Martin Hope
Joker
Asked: 2021-12-25 13:41:17 +0800 CST

如何忽略“命令替换:输入中忽略的空字节”?

  • 3

我有这个 Linux shell 命令:

echo $(python3 -c 'print("Test"+"\0"+"M"*18)') | nc -u [IP] [PORT]

我的意图是将print语句的输出通过管道传递给 netcat 命令。netcat 命令为某些服务创建一个套接字,该套接字实际上返回传入字符串的标准输出。

这里的问题是,当我尝试运行此命令时,我收到以下消息 -bash: warning: command substitution: ignored null byte in input:我的空字节\0被忽略了。但我不希望空字节被忽略。

如何告诉系统不要忽略我的空字节并完全按照我指定的方式接收输入。

我已经进行了一些谷歌搜索,但老实说,它们并没有太大帮助。此外,非常感谢任何指向一些精彩文章的链接。


编辑

使用printf工作。

通常通过python3 -c 'print("Test"+"\0"+"M"*18)'也有效。重视@cas 解释。我想我可能会坚持,printf因为它更快(尽管在我的情况下速度并不是特别关心的问题)。

感谢所有做出贡献的人:-)。

bash command-substitution
  • 2 个回答
  • 4255 Views

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