我是盲人还是没有类似的--in-place
选择sort
?
为了将结果保存到输入文件,sed 使用-i
( --in-place
)。
将输出重定向sort
到输入文件
sort < f > f
Run Code Online (Sandbox Code Playgroud)
导致它为空。如果没有--in-place
选择 - 也许有一些技巧可以方便地做到这一点?
(我唯一想到的是:
sort < f > /tmp/f$$ ; cat /tmp/f$$ > f ; rm /tmp/f$$
Run Code Online (Sandbox Code Playgroud)
移动不是正确的选择,因为可能会更改文件权限。这就是为什么我用临时文件的内容覆盖,然后将其删除。)
是否可以在交互式bash shell 中输入输出一些文本的命令,以便它出现在下一个命令提示符下,就好像用户在该提示符下输入了该文本一样?
我希望能够创建source
一个脚本,该脚本将生成一个命令行并输出它,以便在脚本结束后提示返回时出现该脚本,以便用户可以在按下enter
执行它之前选择对其进行编辑。
这可以通过xdotool
但仅当终端在 X 窗口中并且安装时才有效。
[me@mybox] 100 $ xdotool type "ls -l"
[me@mybox] 101 $ ls -l <--- cursor appears here!
Run Code Online (Sandbox Code Playgroud)
这可以仅使用 bash 来完成吗?
有没有办法只在没有临时文件的情况下执行另一个命令?我有一个运行时间更长的命令和另一个用于格式化输出并使用 curl 将其发送到 HTTP 服务器的命令。如果我只是执行commandA | commandB
,commandB
将启动curl
,连接到服务器并开始发送数据。因为commandA
时间太长,HTTP 服务器会超时。我可以随心所欲commandA > /tmp/file && commandB </tmp/file && rm -f /tmp/file
出于好奇,我想知道是否有办法在没有临时文件的情况下做到这一点。我试过了,mbuffer -m 20M -q -P 100
但卷曲过程仍然从一开始就开始了。Mbuffer 等待直到commandA
实际发送数据完成。(数据本身最多只有几百 kb)
shell 管道的威力如此之大,有时让我失望。
只是作为一个例子,管道
echo abc > file.txt
cat file.txt | sed 's/a/1/' > file.txt
Run Code Online (Sandbox Code Playgroud)
给我一个空的file.txt
。意识到 shell 可能>
首先调用,我做了一个改变:
echo abc > file.txt
{cat file.txt | sed 's/a/1/'} > file.txt
Run Code Online (Sandbox Code Playgroud)
另一个空文件再次让我感到惊讶file.txt
。一种最终有效的丑陋方式是
echo abc > file.txt
echo $(cat file.txt | sed 's/a/1') > file.txt
Run Code Online (Sandbox Code Playgroud)
这会强制 shell 首先运行子 shell,然后重定向。
虽然我知道更好的实践sed
,它可以让你摆脱echo
, cat
, grep
.. 等,但我在这里很好奇的是完全学习 shell 的语法。这个问题不是关于如何解决上面的特定问题。
Q1(编辑:题外话)有没有好的资源可以让我学习语法?
恐怕不同的外壳可能有不同的语法,所以
Q2我可以使 shell 变得冗长,并且每次运行命令时都能清楚地看到它在做什么吗?
Q3(编辑:题外话)关于良好实践的任何其他建议?谢谢!