标签: bash

强制 bash 脚本使用 tee 而不从命令行进行管道传输

我有一个带有大量输出的 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每次都键入。

谢谢,汤姆

bash

21
推荐指数
4
解决办法
3万
查看次数

Unix:以破折号开头的文件,-

好的,我有一堆以破折号开头的文件,-。这不太好......我想重命名它们。在我的特殊情况下,我只想在他们面前放一个角色。

我发现下面这行应该有效,但由于它是破折号,它没有:

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)

我现在不知道该怎么做...叹气

unix bash rename

21
推荐指数
2
解决办法
1万
查看次数

使用 find-command 时避免权限被拒绝的垃圾邮件

我经常尝试使用以下语法查找文件:

find . -name "filetofind"
Run Code Online (Sandbox Code Playgroud)

但是,它通常会导致有关权限被拒绝的文件夹的行数或错误报告(权限被拒绝)。除了使用错误输出中的 sudo 或高级 grepping 之外,还有其他方法可以避免这种垃圾邮件吗?

bash find

21
推荐指数
2
解决办法
2万
查看次数

编写可在任何 shell 上运行的 shell 脚本(使用多个 shebang 行?)

我刚刚开始更深入地研究 shell 脚本,我总是把我的脚本放在一个文件中,标记它chmod +x然后完成/path/to/script.sh并让任何默认的解释器使用它,我认为它是 zsh,因为这就是我用于我的外壳。显然,它似乎只是/bin/sh默认情况下,即使我从 zsh 提示符执行脚本,因为我开始将特定于 zsh 的东西放入我的脚本中,除非我运行zsh /path/to/script.sh.

为了切入正题,以下是我的问题:

  1. #!/path/to/shell开头没有 shebang 行 ( )时,哪个 shell 执行脚本?我假设/bin/sh但我无法确认。
  2. 在编写可在任何平台上运行的 shell 脚本方面,什么被认为是“最佳实践”?(好吧,这是一种开放式)
  3. 如果 zsh 不可用,是否可以编写一个尝试使用 zsh 并回退到 bash 的脚本?我试过放置两条shebang行,如下所示,但是bad interpreter: /bin/zsh: no such file or directory如果我在没有zsh的机器上尝试它只会出错。

    #!/bin/zsh

    #!/bin/bash

bash zsh shell shell-script bash-scripting

21
推荐指数
1
解决办法
7820
查看次数

如何仅获取用户、pid 和针对特定进程运行的命令?(Ubuntu 11.10)

当我这样做时,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)

linux bash ps

21
推荐指数
1
解决办法
4万
查看次数

同时复制和 chmod/chown

我有一个归我所有的日志文件root,我想复制到另一个用户拥有的目录中供他分析(必须先解压缩)。

目前我不得不

# cp log.xz /home/user/Documents
# chown user:user /home/user/Documents/log.xz
Run Code Online (Sandbox Code Playgroud)

有没有办法同时发出两个命令,也许有一个或多个cp选项?

linux bash

21
推荐指数
2
解决办法
3万
查看次数

为什么`echo -e "\\\SOME_TEXT"` 只显示一个反斜杠?

有人能解释一下 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)

linux bash escape-characters echo escaping

21
推荐指数
1
解决办法
1万
查看次数

星号在 Unix 中作为独立命令的功能是什么?

我在 Red Hat Linux 上的终端中乱搞,当我输入星号 ( *) 后跟回车时,它执行了我目录中的一个程序。为什么?

我最好的猜测是 Unix 将其视为通配符,因此它执行了第一个字母程序。由于my_program.exeone_of_my_programs.program可以通过简单地输入文件名来执行,通配符代表所有可能的文件。由于程序首先按字母顺序排列,Unix 会执行它。这是一个正确的判断吗?

linux unix bash command-line

21
推荐指数
2
解决办法
3926
查看次数

打开正在运行的脚本正在写入的文件是否安全?

我正在运行一个正在写入文件的 shell 脚本。
此脚本可能需要很长时间才能完成,我想监视部分输出而不是等待整个脚本完成。

打开(双击)脚本正在写入的文件是否安全?

linux bash filesystems command-line bash-scripting

21
推荐指数
2
解决办法
1万
查看次数

apt-get install 在 WSL 中不起作用

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 ubuntu apt windows-subsystem-for-linux ubuntu-18.04

21
推荐指数
3
解决办法
6万
查看次数