小编And*_*rew的帖子

在 bash shell 脚本中,编写一个遍历字符串值的 for 循环

在 bash 中,我知道可以编写一个for循环,其中一些循环控制变量i迭代指定的整数。例如,我可以编写一个 bash shell 脚本来打印 1 到 10 之间的整数:

#!/bin/bash

for i in {1..10}
do
 echo $i
done
Run Code Online (Sandbox Code Playgroud)

如果我提供字符串列表,是否可以迭代作为字符串的循环控制变量?例如,假设我有一个fname表示文件名的字符串。我想为每个文件名调用一组命令。例如,我可能想fname使用这样的命令打印内容:

#!/bin/bash

for fname in {"a.txt", "b.txt", "c.txt"}
do
 echo $fname
done
Run Code Online (Sandbox Code Playgroud)

换句话说,在第一次迭代时,fname应该有 value fname="a.txt",而在第二次迭代时,fname应该有 value fname="b.txt",依此类推。不幸的是,上面的语法似乎不太正确。我想获得输出:

一个.txt

b.txt

文件

但是当我尝试上面的代码时,我得到了这个输出:

{a.txt,

b.txt,

c.txt}

你能帮我确定正确的语法,以便我可以迭代地更改变量的值/内容fname吗?感谢您的时间。

bash shell-script for

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

du 为同一个文件给出了两个不同的结果

我是计算化学的研究生,可以访问 Linux 集群。该集群由一个非常大 (25 TB) 的文件服务器组成,其中连接了几十个计算节点。每个计算节点由 8 到 24 个英特尔至强内核组成。每个计算节点还包含一个大约 365 TB 的本地磁盘。

由于研究组的十几个用户经常访问文件服务器,文件服务器主要用于长期文件存储(每晚备份,而计算节点的本地磁盘从不备份)。因此,系统管理员指示我们在本地磁盘上运行模拟——它们的 I/O 速度比文件服务器快——以免其他用户的文件服务器变慢。

因此,我在本地磁盘上运行模拟,然后在完成后,将轨迹文件——我正在运行分子动力学 (MD) 模拟——复制到文件服务器进行存储。假设我有一个traj.trr在节点本地磁盘上的目录中调用的轨迹文件,/home/myusername/mysimulation1/traj.trr. 对于长期存储,我总是复制traj.trr到文件服务器中的一个目录,~/mysimulation1/traj.trr,其中~代表我在文件服务器中的目录,/export/home/myusername。复制之后,然后我习惯性地使用du -h验证它/home/myusername/mysimulation1/traj.trr~/mysimulation1/traj.trr. 这样,我至少可以合理地确定传输到文件服务器是成功的。例如:

cd /home/myusername/mysimulation1/
cp -v traj.trr ~/mysimulation1/
du /home/myusername/mysimulation1/traj.trr -h
du ~/mysimulation1/traj.trr -h
Run Code Online (Sandbox Code Playgroud)

如果这两个调用du -h给出相同的人类可读文件大小,那么我可以合理地确定传输/复制成功。(我的典型traj.trr文件大小从大约 15 GB 到 20 GB 不等,具体取决于我运行的确切模拟。)如果我在这两个文件上运行du(即,没有-h开关)traj.trr,它们的字节大小通常非常非常相似 - - 通常在几个字节内。过去一年半我一直在使用这种整体方法,没有任何问题。

但是,最近我遇到了以下问题:有时du -h报告两个traj.trr文件的大小相差几GB。下面是一个例子: …

disk-usage

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

使用 vi 或 vim 注释掉由行号指定的多行代码

我从这个 Stack Overflow 问题中了解到,可以使用vi/vim注释掉指定范围的行号。例如,假设我有以下 bash 脚本:

#!/bin/bash

This
is
my
very
very
great
script
Run Code Online (Sandbox Code Playgroud)

现在假设我想通过8注释掉行号6(包含单词veryverygreat)使用#注释字符。在vi/ 中vim,我可以简单地输入:6,8s/^/#以获得以下内容:

#!/bin/bash

This
is
my
#very
#very
#great
script
Run Code Online (Sandbox Code Playgroud)

其中注释掉了第 6 行到第 8 行。

我的问题是,是否可以键入一个类似的单行代码来删除#6 行到第 8 行的注释字符(但不会删除文件中的任何其他注释行)?

话虽如此,我意识到关于我是否实际使用vivim. 在实践中,我script.sh使用命令打开一个文件vi script.sh。此外,当我输入命令时which vi,我获得/usr/bin/vi. 然而,当我简单地输入vi并按下 时Enter …

vim vi

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

nohup 是否可以将输出同时写入文件 nohup.out 和屏幕/终端?

我正在使用bash外壳。我经常使用nohup以确保当我关闭启动它们的 shell/终端时我的进程不会停止。我使用如下语法:

nohup myprocess
Run Code Online (Sandbox Code Playgroud)

启动时,nohup给出消息:

nohup: ignoring input and appending output to 'nohup.out'

然后,nohup不再向屏幕输出;它全部写入nohup.out.

然而,我经常想监控我的计算进度。我可以通过阅读nohup.out使用vi或来做到这一点tail,但这可能会很耗时,尤其是当我的计算需要几个小时时。

有什么方法可以将输出同时 打印到屏幕上nohup.out(以防万一我失去了互联网连接并因此关闭了启动该过程的终端)屏幕?谢谢你的时间。

shell bash nohup

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

在 bash 中,如何回显变量名,而不是变量值?

假设我var在 bash 中有一个变量。我可以给它赋值。例如,我将其设为字符串:

var="Test"
Run Code Online (Sandbox Code Playgroud)

我想要的是echo的名称var,而不是var. (我可以用 做后者echo $var,但我实际上想做前者。)

SO 对这个问题的回答说要使用echo ${!var},但是当我这样做时,我 echo 只返回一个空行。例如,这个 bash 脚本

#!/bin/bash

echo "Hi"
var="Test"
echo ${!var}
echo "Bye"
Run Code Online (Sandbox Code Playgroud)

返回此输出:

Hi

Bye
Run Code Online (Sandbox Code Playgroud)

HiBye之间只有一个空行,而不是var。我究竟做错了什么?

我在Ubuntu 10.04.4上运行bash 4.1.5(1)

bash

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

调用多个 bash 脚本并并行运行它们,而不是按顺序运行

假设我有三个(或更多)的bash脚本:script1.shscript2.sh,和script3.sh。我想调用所有这三个脚本并并行运行它们。一种方法是执行以下命令:

nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &
Run Code Online (Sandbox Code Playgroud)

(通常,脚本可能需要几个小时或几天才能完成,所以我想使用nohup它们以便即使我的控制台关闭它们也能继续运行。)

但是,有没有办法通过一次调用并行执行这三个命令?

我在想像

nohup bash script{1..3}.sh &
Run Code Online (Sandbox Code Playgroud)

但这似乎是按顺序执行script1.shscript2.shscript3.sh不是并行执行。

bash shell-script background-process parallelism

22
推荐指数
4
解决办法
11万
查看次数

终止在后台运行的 bash shell 脚本

我经常使用bashshell 脚本为许多不同的文件运行简单的命令。例如,假设我有以下bashshell 脚本,称为script.sh,它foo在三个文本文件"a.txt""b.txt"、上运行程序/命令"c.txt"

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done
Run Code Online (Sandbox Code Playgroud)

此外,假设这foo $strname".txt"很慢,因此脚本的执行将需要很长时间(例如,数小时或数天)。因此,我想使用,nohup以便即使终端关闭或断开连接也能继续执行。我还希望脚本立即转到后台,因此我将使用&运算符。因此,我将使用以下命令来调用script.sh

nohup bash script.sh &
Run Code Online (Sandbox Code Playgroud)

这适用于在后台运行脚本并且没有挂断,但现在假设我想出于某种原因在某个时候终止执行。我怎样才能做到这一点?

我遇到的问题是,通过查看top,我只能看到foo对应于"a.txt". 我可以终止那个foo调用,但是foo相应的 to"b.txt"被调用,然后我也必须终止那个调用,依此类推。对于for循环中指定的数十或数百个文本文件,每foo一个都一个一个地终止变得很痛苦!因此,我需要以某种方式终止 shell 脚本本身,而不是从 shell 脚本发出的特定调用。

当我输入命令时

ps -u myusername
Run Code Online (Sandbox Code Playgroud)

myusername我的用户名在哪里,我得到了我正在运行的进程列表。但是我看到两个不同的进程 ID 称为bash. …

shell process kill ps shell-script

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

是否可以使用 gzip 压缩非常大的文件(~30 GB)?

是否可以使用 gzip 压缩非常大的文件(~30 GB)?如果是这样,我应该使用哪些命令、开关和选项?

或者是否有另一个程序(最好是在 Ubuntu 发行版上普遍可用的程序)可以用来压缩/压缩非常大的文件?你有这方面的经验吗?

filesystems compression gzip files

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

为什么 vi 明显损坏(viminfo 错误 E576),我该如何修复?

我精通使用 Unix/Linux,但我不是专家。如果我想打开一个文件(例如,file.txt),我使用vi

vi file.txt
Run Code Online (Sandbox Code Playgroud)

这将打开文件,如果我想关闭它,我使用:q!. 在我使用 Unix/Linux 的两年里,我一直在使用这种方法。我所在的机构有一个运行 Ubuntu Linux 的集群。

但是,今天,我尝试打开一个文件,但收到以下错误消息:

E576: viminfo: Missing '>' in line: newest to oldest):
E576: viminfo: Missing '>' in line: ?/CJ
E576: viminfo: Missing '>' in line: ?/CG
E576: viminfo: Missing '>' in line: ?/CC
E576: viminfo: Missing '>' in line: ?/OEP
E576: viminfo: Missing '>' in line: ?/CEP
E576: viminfo: Missing '>' in line: ?/dih
E576: viminfo: Missing '>' in line: ?/ang
E576: viminfo: Missing '>' …
Run Code Online (Sandbox Code Playgroud)

ubuntu vi

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

如何找到我的本地邮件池?

我是一名研究生,也是一个相对的 Linux 新手。这个问题是我之前问题的衍生。我的机构有一个 Ubuntu Linux 集群。我只是一个用户;我没有系统管理员权限,当然也不具备成为系统管理员的专业知识!

我的问题是,如何找到我的本地邮件假脱机?据我所知,我没有使用邮件传输代理。 对我上一个问题的回答建议我查找文件/var/spool/mail/$USER,但不幸的是,我没有看到与我的用户名对应的文件。在 中/var/spool/mail/,使用ls我只看到两个文件:nobodywww-data,它们都是无扩展名的文件。

对于我可以在哪里查找我的邮件池(据我所知,这可能是本地的,因为我没有配置邮件传输代理),您还有其他想法吗?

email mail-transport-agent

19
推荐指数
3
解决办法
11万
查看次数