在 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吗?感谢您的时间。
我是计算化学的研究生,可以访问 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。下面是一个例子: …
我从这个 Stack Overflow 问题中了解到,可以使用vi/vim注释掉指定范围的行号。例如,假设我有以下 bash 脚本:
#!/bin/bash
This
is
my
very
very
great
script
Run Code Online (Sandbox Code Playgroud)
现在假设我想通过8注释掉行号6(包含单词very,very和great)使用#注释字符。在vi/ 中vim,我可以简单地输入:6,8s/^/#以获得以下内容:
#!/bin/bash
This
is
my
#very
#very
#great
script
Run Code Online (Sandbox Code Playgroud)
其中注释掉了第 6 行到第 8 行。
我的问题是,是否可以键入一个类似的单行代码来删除第#6 行到第 8 行的注释字符(但不会删除文件中的任何其他注释行)?
话虽如此,我意识到关于我是否实际使用vi或vim. 在实践中,我script.sh使用命令打开一个文件vi script.sh。此外,当我输入命令时which vi,我获得/usr/bin/vi. 然而,当我简单地输入vi并按下 时Enter …
我正在使用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(以防万一我失去了互联网连接并因此关闭了启动该过程的终端)和屏幕?谢谢你的时间。
假设我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)
在Hi和Bye之间只有一个空行,而不是var。我究竟做错了什么?
我在Ubuntu 10.04.4上运行bash 4.1.5(1)。
假设我有三个(或更多)的bash脚本:script1.sh,script2.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.sh,script2.sh而script3.sh不是并行执行。
我经常使用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. …
是否可以使用 gzip 压缩非常大的文件(~30 GB)?如果是这样,我应该使用哪些命令、开关和选项?
或者是否有另一个程序(最好是在 Ubuntu 发行版上普遍可用的程序)可以用来压缩/压缩非常大的文件?你有这方面的经验吗?
我精通使用 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) 我是一名研究生,也是一个相对的 Linux 新手。这个问题是我之前问题的衍生。我的机构有一个 Ubuntu Linux 集群。我只是一个用户;我没有系统管理员权限,当然也不具备成为系统管理员的专业知识!
我的问题是,如何找到我的本地邮件假脱机?据我所知,我没有使用邮件传输代理。 对我上一个问题的回答建议我查找文件/var/spool/mail/$USER,但不幸的是,我没有看到与我的用户名对应的文件。在 中/var/spool/mail/,使用ls我只看到两个文件:nobody和www-data,它们都是无扩展名的文件。
对于我可以在哪里查找我的邮件池(据我所知,这可能是本地的,因为我没有配置邮件传输代理),您还有其他想法吗?
bash ×4
shell-script ×3
shell ×2
vi ×2
compression ×1
disk-usage ×1
email ×1
files ×1
filesystems ×1
for ×1
gzip ×1
kill ×1
nohup ×1
parallelism ×1
process ×1
ps ×1
ubuntu ×1
vim ×1