Questions tagged «shell»

Shell是Unix的命令行界面。您可以交互地在外壳程序中键入命令,也可以编写脚本来自动执行任务。使用此标记可解决适用于/ bin / sh和大多数兼容shell(ash,bash,ksh,zsh等)的问题。对于有错误的Shell脚本,请在此处发布之前在http://shellcheck.net中对其进行检查。


6
sh递归副本(cp -r)-如何排除子文件夹
我需要运行使用远程脚本ssh通过Ruby(网/ SSH)递归复制文件夹,并排除子文件夹。我正在寻找最快的方法,所以这样做rsync不是很好。另外,我了解ssh使用sh而不是bash。 在bash中,我这样做: cp -r srcdir/!(subdir) dstdir 而且效果很好。但是,当我通过启动脚本时ssh收到错误消息 sh: 1: Syntax error: "(" unexpected 因为它正在使用sh。 我已经检查了sh手册页,但是没有排除文件的选项。 我ssh使用sh正确的假设吗?还有其他建议吗? 编辑1: 如果有用,则输出sudo cat /etc/shells如下: # /etc/shells: valid login shells /bin/sh /bin/dash /bin/bash /bin/rbash /usr/bin/tmux /usr/bin/screen 编辑2: 确定。因此,bash可用,这似乎不是问题。我已验证ssh实际上正在使用bash。这个问题似乎与括号或感叹号的转义有关。我试图从外壳(macos)运行命令,这是实际的命令: ssh -i .ssh/key.pem ubuntu@X.X.X.X 'mkdir /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; cp -r /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/!\(constant\) /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N; ln -s /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/mesh/constant /home/ubuntu/OpenFOAM/ubuntu-4.1/run/LES_New-Area_residuals2/N/constant' 这样我会收到另一个错误 cp: …
8 shell  ssh  cp 

3
Shell:在if中使用带有参数的函数
我正在尝试执行以下代码,但是当我尝试在if语句中使用函数时,-bash: [: too many arguments出现错误。为什么会这样呢? 先感谢您! notContainsElement () { local e match="$1" shift for e; do [[ "$e" == "$match" ]] && return 1; done return 0 } list=( "pears" "apples" "bananas" "oranges" ) blacklist=( "oranges" "apples" ) docheck=1 for fruit in "${list[@]}" do if [ notContainsElement "$fruit" "${blacklist[@]}" -a …

2
zsh中函数的调用上下文:等同于bash`caller`
在bash中,我可以写: caller 0 并接收呼叫者上下文的: 电话号码 功能 脚本名称 这对于调试非常有用。鉴于: yelp () { caller 0; } 然后,我可以写信yelp查看正在到达的代码行。 我可以实现caller 0在bash如下: echo "${BASH_LINENO[0]} ${FUNCNAME[1]} ${BASH_SOURCE[1]" 我怎样才能获得相同的输出caller 0中zsh?


2
将文件添加到tbz文件
我正在寻找一种更新数千个.tbz存档文件的方法,因此我将使用Shell脚本进行此操作。我需要向每个文件添加一个文件。 我的问题是,有没有一种更快的方法,而无需提取每个tbz的内容,然后使用包含的tar中包含的新文件进行重新压缩?这些命令是什么样的? 谢谢

2
测试变量是否包含换行符(POSIX)
我知道有些外壳接受这种测试: t() { [[ $var == *$'\n'* ]] && res=yes || res=no printf '%s ' "$res"; } var='ab cd' t var='abcd' t echo 执行时: $ bash ./script yes no 什么是POSIX(破折号)工作等效项 以下是可靠的测试方法吗? nl=' ' t() { case "$var" in *$nl* ) res=yes ;; * ) res=no ;; esac printf '%s ' …


6
基于返回值而不是退出代码构造管道的优美方法?
当状态代码无效时,是否仍然可以根据stdout的输出构造管道? 我希望答案不是解决用例,而是shell脚本范围内的问题。我要尝试做的是根据国家和语言代码猜测名称,从而找到存储库中最具体的软件包。 以这个为例 $PACKAGE1=hunspell-en-zz $PACKAGE2=hunspell-en 第一个猜测更合适,但可能不存在。在这种情况下,我想回到hunspell-en($PACKAGE2),因为第一个选项hunspell-en-zz($PACKAGE1)也不会存在。 apt-cache的管道 apt-cache只要命令能够运行(从的文档apt-cache),该命令就会返回成功(由shell定义为退出代码零) apt-cache在正常运行时返回零,在错误时返回十进制。 这使得在管道中使用该命令更加困难。通常,我期望404的等效程序包搜索会导致错误(如curl或会发生wget)。我想搜索以查看是否存在一个软件包,如果不存在,则回退到另一个软件包。 这不会返回任何内容,因为第一个命令将返回成功(因此,||从不运行rhs ) apt-cache search hunspell-en-zz || apt-cache search hunspell-en apt-cache search 有两个参数 这不会返回任何内容,因为apt-cache它的参数是AND, apt-cache search hunspell-en-zz hunspell-en 来自的文档 apt-cache 可以使用单独的参数来指定多个和在一起的搜索模式。 因此,由于其中一个参数显然不存在,因此不会返回任何内容。 问题 什么是外壳惯用语来处理约定,例如apt-cache在返回代码对任务无用的情况下?而成功仅取决于STDOUT上是否存在输出? 相似 一无所获使查找失败 他们都源于同一个问题。那里选择的答案提到find -z了可悲的是这里不适用于解决方案,并且是针对用例的。没有提及习惯用法或在不使用空终止的情况下构建管道(不是的选项apt-cache)

1
为什么以存储的嵌套命令返回码退出会导致Dash和Bash中的返回码不同?
跑步 bash -c 'bash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 根据我的理解,这导致将结果test1打印到控制台并echo $?进行打印1,因为命令应该返回内部[b/d]ash -c返回的内容,而 dash -c 'dash -c "echo test1; exit 1;" &> /tmp/x; buildresult=$?; tail -n 100 /tmp/x; exit $buildresult;' 结果相同,但0根据则返回echo $?。 我想了解这种差异,以便加深对Shell和可移植Shell编程的了解。 我在Ubuntu 17.10(Artful Aardvark)上使用bash4.4.12和dash0.5.8-2.3ubuntu1。

3
/之间的差异复制内容文件夹。和/ *在Linux中
从我读过的文件夹中复制内容,用途是: cp -rfva ../foldersource/. ./ 但这也有效 cp -rfva ../foldersource/* ./ 有什么区别吗? 例如,如果我想使用删除文件夹中的内容。: rm -rf ../foldersource/. 我得到错误: rm: rejet delete folder '.' or '..': 但是带星号可以 rm -rf ../foldersource/* 那么,星号是可以在任何地方使用的更好的选择吗?
8 linux  shell 

1
在bash中创建我自己的cp函数
对于一项作业,我被要求巧妙地编写一个bash函数,该函数具有与该函数cp(副本)相同的基本功能。它仅需将一个文件复制到另一个文件,因此无需将多个文件复制到新目录。 由于我是bash语言的新手,所以我不明白为什么我的程序无法正常工作。原始功能要求覆盖文件(如果已存在),因此我尝试实现该功能。它失败。 该文件似乎在多行上失败了,但最重要的是,在这种情况下,它检查了要复制到的文件是否已经存在([-e "$2"])。即使这样,它仍然显示如果满足该条件则应该触发的消息(文件名...)。 谁能帮助我修复此文件,从而可能对我的基本语言理解有所帮助?代码如下。 #!/bin/sh echo "file variable: $2" if [-e file]&> /dev/null then echo "The file name already exists, want to overwrite? (yes/no)" read | tr "[A-Z]" "[a-z]" if [$REPLY -eq "yes"] ; then rm "$2" echo $2 > "$2" exit 0 else exit 1 fi else cat …

5
有效地合并/排序/唯一的大量文本文件
我正在尝试天真: $ cat * | sort -u > /tmp/bla.txt 失败与: -bash: /bin/cat: Argument list too long 因此,为了避免一个愚蠢的解决方案(创建一个巨大的临时文件): $ find . -type f -exec cat {} >> /tmp/unsorted.txt \; $ cat /tmp/unsorted.txt | sort -u > /tmp/bla.txt 我虽然可以使用文件一个一个地处理文件(这样可以减少内存消耗,并且更接近流传输机制): $ cat proc.sh #!/bin/sh old=/tmp/old.txt tmp=/tmp/tmp.txt cat $old "$1" | sort -u > …
8 shell  sort  uniq 

3
在#!/ bin / bash中。Unix命令获取一个月中第一个工作日的日期
我正在寻找一个直接的Unix命令来获取下个月的第一个星期日,下个月的第一个星期一,下个月的第一个星期二,下个月的第一个星期三等。 我需要完整的日期格式(时间不是必需的) 我可以获得2、3、4等数字。由于我只想要数字,所以我需要日期格式(包括日,月,年) $ NEXT_MONTH=`date +'%m %Y' -d 'next month'` $ echo $NEXT_MONTH 04 2017 $ NEXT_SUNDAY=`cal $NEXT_MONTH | awk 'NF==7 && !/^Su/{print $1;exit}'` $ echo $NEXT_SUNDAY 2 我需要这些日期来发送电子邮件组的通知。 例如:我可以得到下个月的第一个星期六,如下所示。 $ firstofmonth=$(date -d '+1 months' '+%Y%m01') 20170401 $ firstsaturday=$(date -d "$firstofmonth" '+%Y-%m')-$((7 - \ $(date -d "$firstofmonth" '+%u') )) 2017-04-1
8 shell  date 

3
在shell脚本中添加极大的数字
假设两个数字存储在两个不同的文件中,a.txt并且b.txt。 每个数字都足够大(超过30个数字),而所使用的数字数据类型不支持该数字bash。 如何在外壳中添加它们?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.