我有一个带有大量输出的 bash 脚本,我想更改该脚本(而不是创建一个新脚本)以将所有输出复制到一个文件中,就像我通过 tee 管道传输它一样。
我有一个文件script.sh:
#!/bin/bash
init
do_something_that_outputs_stuff_to_STDOUT
launch_applications_that_output_to_STDOUT
fini
Run Code Online (Sandbox Code Playgroud)
我想将 STDOUT 的副本复制到文件script.log 中,而不必./script.sh | tee script.log每次都键入。
谢谢,汤姆
好的,我有一堆以破折号开头的文件,-。这不太好......我想重命名它们。在我的特殊情况下,我只想在他们面前放一个角色。
我发现下面这行应该有效,但由于它是破折号,它没有:
for file in -N*.ext; do mv $file x$file; done
Run Code Online (Sandbox Code Playgroud)
如果我echo在前面放一个,mv我会得到一堆
mv -N1.ext x-f1.ext
mv -N2.ext x-f2.ext
Run Code Online (Sandbox Code Playgroud)
这是正确的,当然它会认为第一个文件名是选项。所以当我删除echo并运行它时,我只会得到一堆
mv: illegal option -- N
Run Code Online (Sandbox Code Playgroud)
我试图将其更改为
for file in -N*.ext; do mv "$file" "x$file"; done
Run Code Online (Sandbox Code Playgroud)
但似乎只是忽略了引号。试图使用单引号,但变量没有扩展......我在这里做什么?
更新:我现在也尝试引用引号。像这样:
for file in -N*.ext; do mv '"'$file'"' '"'x$file'"'; done
Run Code Online (Sandbox Code Playgroud)
当我回应它时,它看起来是正确的,但是当我实际运行它时,我只是得到
mv: rename "-N1.ext" to "x-n1.ext":: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我现在不知道该怎么做...叹气
我经常尝试使用以下语法查找文件:
find . -name "filetofind"
Run Code Online (Sandbox Code Playgroud)
但是,它通常会导致有关权限被拒绝的文件夹的行数或错误报告(权限被拒绝)。除了使用错误输出中的 sudo 或高级 grepping 之外,还有其他方法可以避免这种垃圾邮件吗?
我刚刚开始更深入地研究 shell 脚本,我总是把我的脚本放在一个文件中,标记它chmod +x然后完成/path/to/script.sh并让任何默认的解释器使用它,我认为它是 zsh,因为这就是我用于我的外壳。显然,它似乎只是/bin/sh默认情况下,即使我从 zsh 提示符执行脚本,因为我开始将特定于 zsh 的东西放入我的脚本中,除非我运行zsh /path/to/script.sh.
为了切入正题,以下是我的问题:
#!/path/to/shell开头没有 shebang 行 ( )时,哪个 shell 执行脚本?我假设/bin/sh但我无法确认。如果 zsh 不可用,是否可以编写一个尝试使用 zsh 并回退到 bash 的脚本?我试过放置两条shebang行,如下所示,但是bad interpreter: /bin/zsh: no such file or directory如果我在没有zsh的机器上尝试它只会出错。
#!/bin/zsh
#!/bin/bash
当我这样做时,ps -ef|grep python我得到以下信息:
myusername 4492 2994 0 10:32 pts/0 00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root 6665 1 0 10:42 ? 00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497 0 11:28 pts/7 00:00:00 grep --color=auto python
Run Code Online (Sandbox Code Playgroud)
如何仅获取运行该进程的用户、进程的pid和命令,如下面的输出所示?
myusername 4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root 6665 /usr/bin/python /usr/lib/system-service/system-service-d
Run Code Online (Sandbox Code Playgroud) 我有一个归我所有的日志文件root,我想复制到另一个用户拥有的目录中供他分析(必须先解压缩)。
目前我不得不
# cp log.xz /home/user/Documents
# chown user:user /home/user/Documents/log.xz
Run Code Online (Sandbox Code Playgroud)
有没有办法同时发出两个命令,也许有一个或多个cp选项?
有人能解释一下 Linux shell 中字符转义的幕后情况吗?我尝试了以下方法并在谷歌上搜索了很多,但没有成功理解正在发生的事情(以及如何发生):
root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"
Hello!
root@sv01:~# echo -e "\\n Hello!"
Hello!
root@sv01:~# …Run Code Online (Sandbox Code Playgroud) 我在 Red Hat Linux 上的终端中乱搞,当我输入星号 ( *) 后跟回车时,它执行了我目录中的一个程序。为什么?
我最好的猜测是 Unix 将其视为通配符,因此它执行了第一个字母程序。由于my_program.exe和one_of_my_programs.program可以通过简单地输入文件名来执行,通配符代表所有可能的文件。由于程序首先按字母顺序排列,Unix 会执行它。这是一个正确的判断吗?
我正在运行一个正在写入文件的 shell 脚本。
此脚本可能需要很长时间才能完成,我想监视部分输出而不是等待整个脚本完成。
打开(双击)脚本正在写入的文件是否安全?
Windows 10 Ubuntu bash 无法安装软件包。每当我尝试使用以下命令安装新软件包时,都会出现相同的错误。
root@VASI-HOME-PC:/mnt/c/Users/vadap# apt-get install atom
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package atom
Run Code Online (Sandbox Code Playgroud)
这不仅适用于 atom pacakge,而且我也尝试安装其他软件包,如 pip 并收到相同的错误。
bash ×10
linux ×5
command-line ×2
unix ×2
apt ×1
echo ×1
escaping ×1
filesystems ×1
find ×1
ps ×1
rename ×1
shell ×1
shell-script ×1
ubuntu ×1
ubuntu-18.04 ×1
windows-subsystem-for-linux ×1
zsh ×1