在Unix Shell编程中,管道运算符是一个非常强大的工具。 使用少量的核心实用程序,系统语言(如C)和脚本语言(如Python),您可以构建极其紧凑且功能强大的Shell脚本,这些脚本将由操作系统自动并行化。
显然,这是一个非常强大的编程范例,但是我没有将管道视为除Shell脚本之外的任何语言的第一类抽象。 使用管道复制脚本功能所需的代码似乎总是很复杂。
所以我的问题是,为什么在现代高级语言(如C#,Java等)中看不到类似于Unix管道的东西? 是否有支持一流管道的语言(shell脚本除外)? 这是一种表达并发算法的方便,安全的方法吗?
以防万一有人提出它,我看了看F#管道转发运算符(forward pipe operator),它看起来更像是函数应用程序运算符。 据我所知,它对数据应用了一个函数,而不是将两个流连接在一起,但是我可以接受更正。
后记:在研究实现协程的同时,我意识到存在某些相似之处。 马丁·沃尔夫(Martin Wolf)在一篇博客文章中描述了一个与我类似的问题,只是用协程而不是管道。
我想在现有的CSV文件中添加一行标题,并进行就地编辑。 我怎样才能做到这一点?
echo 'one, two, three' > testfile.csv
我想结束
column1, column2, column3
one, two, three
更改初始CSV输出不方便。
任何标准命令都可以。 重要的是,文件已就地编辑,并且该行插入到文件的开头。
如何参数化在网格上执行的shell脚本(以qsub开头)? 我有一个Shell脚本,在这里我使用getopts读取参数。
当我启动(qsub script.sh -r firstparam -s secondparam ..)这个带有qsub的工作脚本时,我收到错误消息,
qsub:无效选项-s
qsub:非法-r值
正如qsub认为该参数本身就是。 但是我还没有找到任何解决方案。
谢谢
我们需要尽快将/main/files/2
的数据从一台服务器传输到另一台服务器。 我们目前使用的是/main/files/2
,但是当我们的网络具有900+Mb/s
(已通过iperf
测试)时,我们得到的速度仅为/main/files/3
。 我已经对磁盘,网络等进行了测试,发现只是rsync一次仅传输一个文件,这导致了速度下降。
我发现一个脚本为目录树中的每个文件夹运行不同的rsync(允许您限制为x数),但是我无法使其正常运行,它仍然一次只运行一个rsync。
我在这里找到了/main/files/2
(复制如下)。
我们的目录树是这样的:
/main
- /files
- /1
- 343
- 123.wav
- 76.wav
- 772
- 122.wav
- 55
- 555.wav
- 324.wav
- 1209.wav
- 43
- 999.wav
- 111.wav
- 222.wav
- /2
- 346
- 9993.wav
- 4242
- 827.wav
- /3
- 2545
- 76.wav
- 199.wav
- 183.wav
- 23
- 33.wav
- 876.wav
- 4256
- 998.wav
- 1665.wav
- 332.wav
- 112.wav
- 5584.wav
因此,我想为/ main / files中的每个目录创建一个rsync,一次最多创建5个。 因此,在这种情况下,将运行3个rsync,分别是/main/files/2
、/main/files/2
和/main/files/3
。
我像这样尝试过,但是它一次只为/main/files/2
文件夹运行1个rsync:
#!/bin/bash
# Define source, target, maxdepth and cd to source
source="/main/files"
target="/main/filesTest"
depth=1
cd "${source}"
# Set the maximum number of concurrent rsync threads
maxthreads=5
# How long to wait before checking the number of rsync threads again
sleeptime=5
# Find all folders in the source directory within the maxdepth level
find . -maxdepth ${depth} -type d | while read dir
do
# Make sure to ignore the parent folder
if [ `echo "${dir}" | awk -F'/' '{print NF}'` -gt ${depth} ]
then
# Strip leading dot slash
subfolder=$(echo "${dir}" | sed 's@^\./@@g')
if [ ! -d "${target}/${subfolder}" ]
then
# Create destination folder and set ownership and permissions to match source
mkdir -p "${target}/${subfolder}"
chown --reference="${source}/${subfolder}" "${target}/${subfolder}"
chmod --reference="${source}/${subfolder}" "${target}/${subfolder}"
fi
# Make sure the number of rsync threads running is below the threshold
while [ `ps -ef | grep -c [r]sync` -gt ${maxthreads} ]
do
echo "Sleeping ${sleeptime} seconds"
sleep ${sleeptime}
done
# Run rsync in background for the current subfolder and move one to the next one
nohup rsync -a "${source}/${subfolder}/" "${target}/${subfolder}/" </dev/null >/dev/null 2>&1 &
fi
done
# Find all files above the maxdepth level and rsync them as well
find . -maxdepth ${depth} -type f -print0 | rsync -a --files-from=- --from0 ./ "${target}/"
我有input.txt
1
2
3
4
5
我需要得到这样的output.txt
1,2,3,4,5
怎么做?
如何用Ruby覆盖Unix shell中以前打印的行?
假设我想每秒在shell上输出当前时间,但是我不想覆盖每个时间字符串,而是要覆盖以前显示的时间。
我是Scala的新手。 我已经下载了它,并且可以在Eclipse上对其进行开发; 但我无法使其在Terminal中工作。
所有网站和书籍都说只能输入scala
-这是行不通的。
该网站真气地说:
我们假设Scala软件和用户环境都是 正确设置。
我该怎么做?
我对此很陌生,使用Jargon或假设对Scala的框架了解过多,将会破坏良好的响应。 请保持简单。
谢谢
我正在尝试用jenkins做一个自定义的dockerfile。 我要等到8080端口打开,而不是用netcat做一个丑陋的“ sleep 60”,但是对bash脚本和netcat不太有信心。
这是我要执行的操作的一个示例:
#!/bin/bash
opened=0
while [ "$opened" == "0" ]; do
echo "Waiting jenkins to launch on 8080..."
nc -vz localhost 8080
done
echo "Jenkins launched"
我有200条命令的列表/队列,我需要在Linux服务器上的Shell中运行。
我只希望一次最多运行10个进程(从队列中)。 一些过程将花费几秒钟来完成,而其他过程将花费更长的时间。
当进程完成时,我希望从队列中“弹出”下一条命令并执行。
有没有人有代码来解决这个问题?
进一步阐述:
在某种队列中,需要完成200项工作。 我希望一次最多进行10项工作。 当线程完成一项工作时,应向队列询问下一项工作。 如果队列中没有其他工作,则该线程应终止。 当所有线程都死掉时,这意味着所有工作都已经完成。
我要解决的实际问题是使用imapsync
将200个邮箱从旧邮件服务器同步到新邮件服务器。 有些用户的邮箱很大,需要很长时间才能同步,而其他用户的邮箱很小,可以很快同步。
嗨,我有点外壳n00b。
谁能告诉我如何检查Linux Ubuntu计算机上安装的MongoDB版本?
我看到我的MongoDB Shell版本:1.2.2,所以我很确定MongoDB本身也已经过时了。 有人知道“如何更新MongoDB”文档吗? 我发现mongodb.org有点令人困惑。
谢谢,麻烦您了。
好吧,如果我在mongo shell中使用db.version(),它说1.2.2
如果我$ mongod --version我得到这个:
db version v1.2.2, pdfile version 4.5
Wed Oct 16 10:28:22 git version: nogitversion
我跑了
sudo apt-get update
sudo apt-get install mongodb
并得到
sudo apt-get install mongodb
Reading package lists... Done
Building dependency tree
Reading state information... Done
mongodb is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 179 not upgraded.
mongod --version
db version v1.2.2, pdfile version 4.5
Wed Oct 16 10:31:07 git version: nogitversion
那么为什么不更新呢? apt-get是否指向错误的回购/来源?
我需要允许几个应用程序附加到系统变量(在这种情况下为$ PYTHONPATH)。 我正在考虑指定一个目录,每个应用程序都可以在其中添加模块(例如.bash_profile_modulename)。 在〜/ .bash_profile中尝试过类似的操作:
find /home/mike/ -name ".bash_profile_*" | while read FILE; do
source "$FILE"
done;
但它似乎不起作用。
给定一个包含这样数据的文件(即stores.dat文件)
sid|storeNo|latitude|longitude
2tt|1|-28.0372000t0|153.42921670
9|2t|-33tt.85t09t0000|15t1.03274200
返回每行出现“ t”字符的次数的命令是什么?
例如。 会返回:
count lineNum
4 1
3 2
6 3
此外,要按字段计数发生次数,返回以下结果的命令是什么?
例如。 输入第2列和字符“ t”
count lineNum
1 1
0 2
1 3
例如。 输入第3列和字符“ t”
count lineNum
2 1
1 2
4 3
如果命令在字符串中,如何在bash脚本中在后台执行shell命令?
例如:
#!/bin/bash
cmd="nohup mycommand";
other_cmd="nohup othercommand";
"$cmd &";
"$othercmd &";
这行不通-我该怎么做?
我在bash的命令提示符下尝试了以下操作:
sudo cat << EOF > /etc/yum.repos.d/some-name.repo
#Content
#....
#...
EOF
它抱怨:
-bash: /etc/yum.repos.d/some-name.repo: Permission denied
然后我做了sudo su
,并尝试了与cat
之前的sudo
完全相同的东西,并且它没有任何问题。 我在上面缺少什么?
我想遍历一系列提交并对每个提交执行一个shell命令。 如果命令失败,我希望步行停止,否则继续前进。 我查看了filter-branch
,但我不想重写提交,只需将它们检出即可。 for-each-ref
似乎不允许您指定要作用的范围。
我的具体问题是,我创建了一堆提交,并且我想确保每个提交都是可构建的。 我想做类似的事情:
git foreach origin/master..master 'git submodule update && make clean && make'
我当然可以编写一个shell脚本来执行此操作,但是git可能有一种不错的方法。
当我尝试使用sudo将文件中的数据附加到另一个文件时,这是导致“权限被拒绝”的shell命令:
sudo cat add_file >> /etc/file
/etc/file
(即我)所拥有的文件为/etc/file
,其权限为rw-r--r--
。我是否应该暂时成为root
以使其起作用,或者sudo
是否有解决方法?
我正在寻找进行简单输入的最佳方法:
echo -n "Enter a string here: "
read -e STRING
并通过删除非字母数字字符,小写(大写)并用下划线替换空格来清理它。
顺序重要吗? tr
是解决此问题的最佳/唯一方法吗?
众所周知,在bash编程中,传递参数的方式是"${a[*]}"
,...,"${a[@]}"
。但是,我发现将数组作为参数传递给接收多个参数的函数并不容易。 这是一个例子:
f(){
x=($1)
y=$2
for i in "${x[@]}"
do
echo $i
done
....
}
a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF
f "${a[@]}" $b
f "${a[*]}" $b
如上所述,函数"${a[*]}"
接收两个参数:第一个参数分配给数组的"${a[@]}"
,第二个参数分配给y
。
"${a[*]}"
可以通过两种方式调用。 第一种方法使用"${a[@]}"
作为第一个参数,结果是:
jfaldsj
jflajds
第二种方法使用"${a[*]}"
作为第一个参数,结果为:
jfaldsj
jflajds
LAST
两种结果都不如我所愿。 那么,有没有人知道如何正确地在函数之间传递数组?
我正在尝试使用Unix命令从/this/is/could/be/any/path/abc.txt
中获取"abc.txt"
。请注意/this/is/could/be/any/path
是动态的。
任何想法?
提前致谢。