Questions tagged «shell»

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

2
当sh是bash或破折号的符号链接时,bash会将其自身限制为POSIX兼容,因此它应该与sh 100%兼容吗?
从bash和sh之间的区别: ABck的问题:如果你有/bin/sh一个链接的bash,那么bash将不会调用时为具有相同的行为/bin/sh,因为它不会在调用时/bin/bash。当称为时sh,它将限制自己为大多数POSIX兼容以及一组有限的扩展。 这是否意味着每当我在Linux中遇到带有shebang的shell脚本时#!/bin/sh,即使在该发行版上,它bin/sh都是到另一个shell(例如破折号或bash)的符号链接,它应该与bourne shell 100%兼容,因为是否将自身限制为一组有限的扩展名?这样我可以在FreeBSD中执行它们吗?有例外吗?还是我应该确定它会起作用? 因此,如果在发行版上bin/sh是的符号链接bin/bash,并且使用了脚本#!/bin/sh并且该脚本包含bashism,则该脚本将不会运行,因为bash会喜欢处于sh模式?

1
如何找出shell脚本是用bash还是sh编写的
如何确定脚本是用bash还是写的sh? 脚本的第一行在这里没有帮助,因为在Linux上,bash脚本具有以下行: #!bin/sh 实际上,有很多发行版/bin/sh是bash(也许/bin/sh是/bin/bash这些发行版中的链接),而不是Bourne Shell。因此,如果我尝试在FreeBSD中运行以bash编写的脚本,则结果未定义,因为/bin/sh在FreeBSD中是Bourne Shell,而不是bash。 有没有简单的方法可以识别脚本是bash还是sh? 语法中有一些与众不同的东西吗?

4
cp或rsync,cp真的值得吗?
我希望这不会算作一个问题,没有一个真正的答案,因为我似乎无法找到一个很好的理由使用cp(1)了rsync(1)在几乎所有情况。如果一个典型的青睐rsync了cp?有什么好的使用指南吗? rsync:传输差异文件,可以使用压缩,可以远程使用(安全地使用),即使中断也可以重新启动,即使在传输单个大文件时也可以。' cp:也许使用起来更简单?它比rsync快吗?
8 bash  shell  rsync  utilities  cp 

1
Korn Shell:结束,pgup,pgdown和删除键不起作用
所以基本上我End,Pageup/ Pagedown和Delete关键不在ksh93的工作。顺便说一下,我正在运行FreeBSD。 我的箭头键正常工作,我的home键也正常工作。 当我把它放在我的那些键 .kshrc set -o emacs 我已尝试通过将此操作放入我的计算机中来执行此操作.kshrc。使End关键工作。 alias __Y=`echo "\005"` # end = ^e = end of line 我打开vim,然后按Ctrlv并输入005。并且^E出现了。仍然没有任何效果。 任何人都知道要获得那些关键工作吗? 另外,每当我按这些键时,它都会打印出一个~。我也知道我可以使用Ctrld或Ctrla,但我不想使用这些。

4
遍历n个文件?
我有想做的相当简单的事情。我想montage在包含数千个图像的目录上使用,只有很少的选项,即: me@home$ montage -size 256x256 DSC01*.JPG.svg output.png ...但这还不够好,因为一次只能捕获约100张图像;既不是 me@home$ montage -size 256x256 *.svg output.png ...它会同时抓取所有图像,因为生成的文件太大而无法解析。 我想做的是一次遍历100-200个文件。我猜这可以使用for循环(?)来实现,但是我对如何做到这一点感到有些困惑。我猜可能有一种聪明的使用方式,find -exec或者xargs我没有想到。我正在使用bash,但zsh偶尔使用。 因此,总而言之,我正在寻找一种衬纸,给定2600个图像文件,调用蒙太奇大约13或26次(每100-200个文件一次),给定n个文件,可以被称为n次的倍数。

1
如何定义`bc`函数供以后使用?
我总是发现bc一种神秘而有趣的东西。这是一个在原来的Unix程序。它本身就是一种编程语言。因此,我很高兴能有机会找到使用它的机会。 由于bc似乎不包含阶乘函数,因此我想这样定义一个: define fact(x) { if (x>1) { return (x * fact(x-1)) } return (1) } 但是...我不能再使用了,可以吗? 我希望能够做类似的事情 me@home$ bc <<< "1/fact(937)"
8 shell  bc 

3
将数组传递给函数的最正确方法是什么?
考虑我有一个非常大的数组$large_list,有没有办法编写一个将数组作为参数的函数?例如: echo_idx_array () { arr="$1" idx="$2" echo "${arr[$idx]}" } 做这样的事情的通常策略是什么?我试着给变量,$large_list但它是空的。 我愿意修改该函数以使其适应参数列表中的任何更改。 作为记录,我正在使用ksh88,并且正在寻找尽可能便携的答案。 编辑:到目前为止,我能想到的最好的办法是遍历数组并将每个元素作为参数发送给函数。这看起来非常丑陋且容易出错,更不用说它一定会很快达到某个极限。这是我所做的: foo () { echo $* } cmd="foo " while [[ $i -lt $MAX_ARR_SIZE ]]; do cmd="$cmd ${large_list[$i]}" ((i=i+1)) done eval $cmd 有没有更好的事情要做?
8 shell  ksh  array 


2
如何将网络或用户源连接数据添加到历史记录条目?
我想为我管理的系统上的所有用户修改历史记录设置。我希望它包含来自连接终端的信息,例如来自who sysadmin:/ # who sysadmin pts/0 Mar 26 07:11 (sysadmin.doofus.local) 我目前通过以下方式修改我的历史记录。我知道其中许多设置已在这里讨论过几次。但是,很久以前,我从“ Linux系统管理食谱:Juliet Kemp ”中提取了此代码。 shopt -s histappend PROMPT_COMMAND='history -n;history -a' HISTSIZE=100000 HISTFILESIZE=100000 HISTTIMEFORMAT="%m/%d/%y %T " shopt -s histappend 解决了当您有多个终端时打开的信息可能会丢失的问题。 PROMPT_COMMAND='history -n;history -a' 扩展以提供跨多个终端的实时历史记录。 HISTSIZE=100000 HISTFILESIZE=100000 延长history保留时间 HISTTIMEFORMAT="%m/%d/%y %T “在历史的每一行前都加上时间戳 您通常会得到什么 history 835 ls 836 cd .. 我修改的当前history结果 5853 03/26/12 07:16:49 …

7
Linux脚本或程序以缩短文件名
我找不到Linux版本的namemangler并没有取得很大的成功,我需要重命名1000个文件,以便它们在Windows上可读。 有谁知道可以执行此操作的Linux程序? 如果没有,那么脚本可能会起作用,因为我只需要将文件夹中的所有文件重命名为前16个字符。我怀疑脚本路线可能值得一试,但不确定从哪里开始。

5
如何在Korn Shell中获取subshel​​l的PID(相当于$ BASHPID)
在bash中,您有一个方便的变量:$ BASHPID wich始终返回当前运行的子Shell的PID。如何在ksh中获取子外壳的PID?例如,请参见下面的代码: #!/usr/bin/ksh93 echo "PID at start: $$" function run_in_background { echo "PID in run_in_background $$" run_something & echo "PID of backgrounded run_something: $!" } function run_something { echo "*** PID in run_something: $$" sleep 10; } run_in_background echo "PID of run in background $!" 输出以下内容: PID at start: …

3
如何将相同的awk操作应用于不同的文件?
我是awk的新手,我不知道是否可以编写执行此操作的awk脚本: 我有数百个必须排序的数据文件。对于每一个,我使用以下一线: awk 'ORS=NR%3?" ":"\n" ' file1.tex > file1_sorted.tex awk 'ORS=NR%3?" ":"\n" ' file2.tex > file2_sorted.tex ... 然后得到所需的输出。但是我想有一个脚本来自动执行此操作,获取每个文件,应用该操作并编写相应的排序文件。 多谢您的协助!
8 shell  awk 

1
在没有chsh或管理员特权的情况下更改默认Shell
我在该线程中看到了以下代码片段:如何将csh更改为bash作为默认shell sleep 2 if (-x /usr/local/bin/bash) then exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash' endif 我的理解是,如果您将此代码段放入~/.login其中,则bash在您登录时会调用它。 我遇到类似的情况,我想使用类似的代码段来调用zsh与我登录时所使用的默认代码段不同的代码段。遇到这种麻烦的部分原因是因为我无法选择zsh在中允许的选项中我想要的版本chsh,并且我没有管理员权限。 有了这个: 在不同版本的zsh之间切换时,如何更改上面的代码段来执行此操作? 为什么exec上面的代码片段需要两个命令?他们在做什么?另外,为什么上述代码段使用sh 和 bash(用户应该使用登录csh)
8 shell  zsh  login  exec 

3
如何使用for循环发现新行?
在网上的各个地方,我发现: \015 \012 \x0a - hex \n \r 全部作为各种换行符/回车符的同义词... 但是在这个小脚本中,我无法识别出遇到换行符的情况-有人可以告诉我我应该在if行中检查什么吗? #!/bin/bash test="this is a test" for a in "$test"; do if [[ "$a" == '\012' ]] ; then echo "FOUND NEWLINE" fi echo "$a" done
8 bash  shell  string 

3
重击字符串用一个替换多个字符
我从提要标题中将字母和数字以外的所有字符替换为破折号,以将结果用作任何文件系统的安全文件名: $ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar" $ echo ${t//[^A-Za-z0-9]/-} Episodie-06--No-hope-of-riding-home--NEW----Advanced-grammar 但是我想将所有重复的破折号压缩成一个 Episodie-06-No-hope-of-riding-home-NEW-Advanced-grammar 我发现我可以使用两遍替换来实现: $ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar" $ tmp=${t//[^A-Za-z0-9]/-} $ echo ${tmp//--/-} Episodie-06-No-hope-of-riding-home-NEW--Advanced-grammar 我以为我可以像这样通过一个步骤: $ echo ${t//[^A-Za-z0-9]+/-} 但这不起作用。 有什么线索吗? 注意:我不想使用sed或其他工具
8 bash  shell  string 

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.