我正在尝试编写短脚本,以及以下命令:
echo "aaa111 bbb111" | xargs -I {} echo {} | sed 's/111/222/g'
Run Code Online (Sandbox Code Playgroud)
回归aaa222 bbb222,这是我所期待的.
我期待下一个命令:
echo "aaa111 bbb111" | xargs -I {} echo $(echo {} | sed 's/111/222/g')
Run Code Online (Sandbox Code Playgroud)
返回相同,但它返回aaa111 bbb111!这是为什么?
UPD:我想要实现的目标:
我有很多文件,比如pic30-coff-gcc,pic30-coff-ag等等,我需要为每个文件创建一个符号链接,比如pic30-gcc- > pic30-coff-gcc等.
所以我写了这个:
ls|grep 'coff-'|xargs -I {} ln -s {} $(echo {} | sed 's/coff-//g')
Run Code Online (Sandbox Code Playgroud)
它不起作用:对于每个文件,它报告该文件存在.我检查了这样的命令:
ls|grep 'coff-'|xargs -I {} echo "ln -s {} $(echo {} | sed 's/coff-//g')"
Run Code Online (Sandbox Code Playgroud)
是的,这sed部分不起作用:
ln -s pic30-coff-gcc …Run Code Online (Sandbox Code Playgroud) 更准确地说,为什么
"`command "$variable"`"
Run Code Online (Sandbox Code Playgroud)
将外部引号视为包含内部引号,而不是将变量扩展到任何引号之外?
我用来测试的确切命令类似于另一个 stackoverflow 问题中关于使用命令替换时正确引用方法的示例:
fileName="some path with/spaces"
echo "`dirname "$fileName"`"
Run Code Online (Sandbox Code Playgroud)
它正确地回应了“some path with”,而不是因为参数数量无效而抱怨。
我阅读了 Bash 的手册页,它在“扩展”一章的“命令替换”部分中指出,新样式的 $() 替换保留了括号之间任何字符的含义,但是,关于反引号,它只提到反斜杠起作用以有限的方式:
当使用旧式反引号替换形式时,反斜杠保留其字面意义,除非后跟
$,`, 或\。前面没有反斜杠的第一个反引号终止命令替换。
我的第一个想法是反引号做同样的事情,除了提到的例外,因此“引用”内部双引号,但是,我被告知事实并非如此。将我指向这个方向的第二个观察是
a=\$b
b=hello
echo `echo $a`
Run Code Online (Sandbox Code Playgroud)
打印“$b”。如果反引号让美元符号被解释,那么第一个变量替换应该在调用子shell之前发生,子shell扩展字符串“$b”,产生“hello”。根据手册页的上述摘录,我什至可以确保美元符号确实被引用,通过使用
echo `echo \$a`
Run Code Online (Sandbox Code Playgroud)
结果还是一样。
不过,第三个观察结果让我有些怀疑:
echo `echo \\a`
Run Code Online (Sandbox Code Playgroud)
结果:“\a”
echo \a
Run Code Online (Sandbox Code Playgroud)
结果:一个
在这里,似乎两个反斜杠都被保留了,直到子外壳发挥作用,即使手册页指出反引号中的反斜杠在后面跟另一个反斜杠时没有其字面意义。编辑:^ 在这方面,一切都按预期工作,我一定使用了错误的 shell(在我的另一个终端中使用了 tcsh,并且字符与“a”不同)。
虽然我无法找出实际发生的情况,但在我寻找答案时,我遇到了一些人提到了有关命令替换的术语“引用上下文”,但没有对其含义或位置进行任何解释它被描述。我在 Bash 参考资料(gnu.org、tldp、man bash)或通过 DuckDuckGo 中都没有找到任何对“引用上下文”的真正参考。
除了了解正在发生的事情之外,我更希望获得一些关于如何从中辨别这种行为的参考或指导,因为我认为我可能没有将一些自然产生的部分放在一起。否则我会忘记答案。
对于那些建议人们使用新式美元符号和括号替换的人:在大约。具有数十或数百种不同专有环境的 50 年老 Unix 机器(不能为更新的环境扔掉外壳),当必须编写在任何人可能使用的大多数外壳之间兼容的脚本时,这不是一种选择。
感谢任何可以帮助我的人。
我试图在挑战中利用缓冲区溢出,缓冲区从环境变量中获取它的值。在 GDB 中,我知道您可以使用以下命令设置环境变量:
set environment username = test
Run Code Online (Sandbox Code Playgroud)
但是我需要传递用户名变量特殊字符,所以我需要执行以下操作:
set environment username= $(echo -e '\xff\x4c......')
Run Code Online (Sandbox Code Playgroud)
但是该命令没有被执行并且用户名变量包含我写下的字面意思,有人知道将特殊字符传递给环境变量的技巧吗?
linux command-line gdb environment-variables command-substitution
我正在尝试运行一个命令,该命令有一个$()参数(不确定那个叫什么)应该在Docker容器中进行评估.例如:
docker exec mycontainer echo $(whoami)
Run Code Online (Sandbox Code Playgroud)
执行此操作时,whoami首先在主机上运行,然后插入主机的用户.相反,我希望whoami在容器中评估该命令,以便容器的用户被回显.
我发现很难找到任何帮助.我试过的替代方案不起作用:
docker exec mycontainer 'echo $(whoami)'
docker exec mycontainer echo '$(whoami)'
docker exec mycontainer echo $$(whoami)
docker exec mycontainer echo \$(whoami)
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
我有一个username和password变量。我想将它们编码为 base64,格式为username:password.
#!/bin/bash
username=username
password=password
echo Encoding username/password...
echo $username:$password | base64
Run Code Online (Sandbox Code Playgroud)
这可行,但我不确定如何将输出放入变量中而不是将其写入控制台。
顺便说一句,为什么输出与https://www.base64encode.org/这样的网站不同?
有人可以解释为什么A并且B表现不同吗?
A=`echo hello how are you | wc -w`
Run Code Online (Sandbox Code Playgroud)
和
CMD="echo hello how are you | wc -w"
B=`$CMD`
Run Code Online (Sandbox Code Playgroud)
他们给出不同的结果:
$echo $A
4
$echo $B
hello how are you | wc -w
Run Code Online (Sandbox Code Playgroud)
我想要的是变量中的命令,我可以在脚本的多个点执行该命令并获取不同的值进行比较。它曾经工作正常,但如果命令有管道,它就不起作用。
我正在执行命令替换并将结果保存到变量中。但是,命令的结果包含双引号,这导致变量为空。
运行时,test="$(java -version)"我得到以下结果:
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
但是运行会echo $test产生一个空行。
$*相当于$1 $2 $3...- 拆分所有空格.
"$*"相当于"$1 $2 $3..."- 这里没有分裂.
"$@"相当于"$1" "$2" "$3"...- 分裂参数(每个参数单独引用).
如何引用$(command) 以便它以相同的方式"$@"处理命令的输出行来处理参数?
我想解决的问题:
我有一个备份函数,通过参数获取文件并备份每个文件(例如:) backup file1 file_2 "file 3".我想快速备份另一个命令返回的文件.
mycmd返回三个文件(每行一个):file1,file_2和file 3(包含空格).如果我运行以下命令:
backup $(mycmd)
它将等同于运行,backup file1 file_2 file 3并且由于不存在的文件和3而导致错误.但是这样运行:
backup "$(mycmd)"
相当于运行:
backup "file1 file_2 file 3"
它们都不够好.
如何使用命令替换来获得相当于的调用:backup "file1" "file_2" "file 3"?
目前我唯一的解决方法是:
while read line; do backup "$line"; done …
使用:
CMD ["$(pipenv --venv)/bin/python3", "main.py", "/root/uploads"]
Run Code Online (Sandbox Code Playgroud)
导致错误docker run:
Error response from daemon: invalid header field value "oci runtime error: container_linux.go:247: starting container process caused \"exec: \\\"$(pipenv --venv)/bin/python3\\\": stat $(pipenv --venv)/bin/python3: no such file or directory\"\n"
Run Code Online (Sandbox Code Playgroud)
$(pipenv --venv)/bin/python3有没有办法像CMD 部分那样进行评估命令替换?
我有一个调用curl的bash脚本,并且只有在满足某些条件时我才想传递某个参数:
result=$( curl -sS --retry 3 --retry-delay 10 \
# some more stuff
$([[ $b=="b" ]] && echo -F \"foo=bar\") \
"https://www.someurl.org")
Run Code Online (Sandbox Code Playgroud)
由于某种原因,效果就像我刚刚做的那样:
result=$( curl -sS --retry 3 --retry-delay 10 \
# some more stuff
"https://www.someurl.org")
Run Code Online (Sandbox Code Playgroud)
如何找出问题所在?我努力了
result=$( echo -sS --retry 3 --retry-delay 10 \
$([[ $b=="b" ]] && echo -F \"foo=bar\") \
"https://www.someurl.org")
echo result
Run Code Online (Sandbox Code Playgroud)
还-F "foo=bar"好吗?但为什么它似乎没有影响我的curl 调用?