在编写shell程序时,我们经常使用/bin/sh和/bin/bash.我经常使用bash,但我不知道它们之间有什么区别.
bash和之间的主要区别是sh什么?
我们究竟需要意识到在编程时bash和sh?
我在很多地方看到过,包括对这个网站的推荐(什么是首选的Bash shebang?),#!/usr/bin/env bash优先使用#!/bin/bash.我还看过一个进取的个人建议使用#!/bin/bash是错误的和bash的功能会这样做会丢失.
总而言之,我在严格控制的测试环境中使用bash,其中每个循环驱动器基本上都是单个主驱动器的克隆.我理解可移植性论点,虽然它不一定适用于我的情况.是否有任何其他理由更喜欢#!/usr/bin/env bash替代品,并且假设可移植性是一个问题,是否有任何理由使用它可能会破坏功能?
我需要以不同的用户身份执行bash脚本的一部分,并在该用户的$HOME目录中执行.但是,我不确定如何确定这个变量.切换到该用户并调用$HOME不提供正确的位置:
# running script as root, but switching to a different user...
su - $different_user
echo $HOME
# returns /root/ but should be /home/myuser
Run Code Online (Sandbox Code Playgroud)
似乎问题在于我尝试在脚本中切换用户的方式:
$different_user=deploy
# create user
useradd -m -s /bin/bash $different_user
echo "Current user: `whoami`"
# Current user: root
echo "Switching user to $different_user"
# Switching user to deploy
su - $different_user
echo "Current user: `whoami`"
# Current user: root
echo "Current user: `id`"
# Current user: uid=0(root) gid=0(root) groups=0(root)
sudo su …Run Code Online (Sandbox Code Playgroud) 我不是在谈论UNIX shebang意图给出解释器的路径.事实上,shebang已经很难成功地谷歌这个问题了...
我在谈论bash扩张:
!! 检索前一个命令(类似于向上箭头,但更有用)!$ 检索最后一个命令的最后一个单词!# 似乎检索当前行但实际上有用的是!#什么?
echo !# 扩展到 echo echoecho echo !# 扩展到 echo echo echo echols !#扩展到ls ls.所有这些看起来都是毫无意义的.我所知道的关于!#命令的是我从使用它中学到的东西 - 我不确定我是否知道它的真正功能.
我是一个具有不同体系结构的机器组成的集群上运行的作业:
gcc -march=native -Q --help=target | grep -- '-march=' | cut -f3给我的其中之一:broadwell,haswell,ivybridge,sandybridge或skylake。
可执行文件必须是相同的,所以我不能使用,-march=native但是同时架构具有共同点(我认为它们都支持AVX?)。
I am aware that gcc (contrary to Intel icc) does not allow for multiple archictures in a single executable. What I would like to know is if there is a way to ask gcc for the highest set of instructions compatible with all the architectures listed above.
gcc version: 8.1.1
我读过,如果您想以便携式方式使用Bash,则应该使用shebang:
#!/usr/bin/env bash
但是现在我想知道:当我想明确声明我不依赖Bash而是编写了POSIX兼容脚本时,我应该使用:
#!/bin/sh
还是#!/usr/bin/env sh在这里更可取?
我知道有关于这个主题的一些问题,但似乎都没有解决我的问题.看到这个或这个或这个.
我在Linux,Fedora21上,我正在尝试启用每个用户目录的CGI脚本.我遵循了这些指示,但没有成功.
我收到错误:
[cgi:error] End of script output before headers: test.cgi
Run Code Online (Sandbox Code Playgroud)
test.cgi 是一个可执行的sh文件,包含一个非常简单的脚本:
#!/usr/bin/sh
echo "Content-type: text/plain"
echo ""
echo "Hello"
Run Code Online (Sandbox Code Playgroud)
它有可执行标志,并且没有shell的问题.我也试过Python:同样的结果.
我也禁用了selinux.
我也尝试将debug级别设置为Apache的ErrorLog,但我得到的只是在上面的错误之前被"授予"权限.
我还配置了/etc/httpd/conf.d/userdir.conf文件
<Directory "/home/*/public_html">
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require all granted
</Directory>
<Directory /home/*/public_html/cgi-bin/>
Options ExecCGI FollowSymLinks
SetHandler cgi-script
AddHandler cgi-script .cgi .exe .pl .py .vbs
Require all granted
AllowOverride All
</Directory>
Run Code Online (Sandbox Code Playgroud)
并重新启动服务器.没有成功.一切看起来都很好,我无法理解......有什么不对?
我忘了添加该问题只针对每用户目录:如果我将相同的脚本移动到/var/www/cgi-bin目录,它按预期工作.
shell确实存在:
$ ls /usr/bin/sh …Run Code Online (Sandbox Code Playgroud) 考虑这个 Makfile:
all:
test 1 -eq 2 | cat
echo 'done'
Run Code Online (Sandbox Code Playgroud)
它将被执行而不会出错。
我听说set -o pipefail我可以这样使用:
all:
set -o pipefail; \
test 1 -eq 2 | cat; \
echo 'done'
Run Code Online (Sandbox Code Playgroud)
除了它不起作用之外,这篇文章是非常痛苦的。
另一种解决方案是使用临时文件。我想避免它。
我可以使用什么其他解决方案?
我想从 bash shell(.sh 使用 #!/usr/bin/bash)打开一个应用程序(.app),该应用程序位于 /Applications 中的文件夹中。我该如何打开它?
如果我可以打开它,我可以关闭它吗?如果是,怎么办?
背景:我试图通过节点脚本顶部的 shebang 在非登录 shell 中正确nvm设置。node
节点脚本的 shebang 是login shell:
#!/usr/bin/env node \nRun Code Online (Sandbox Code Playgroud)\n这不起作用,non-login shell所以我想做相当于:
#!/usr/bin/env [[ -s $HOME/.nvm/nvm.sh ]] && source "$HOME/.nvm/nvm.sh" && node\nRun Code Online (Sandbox Code Playgroud)\n但我无法获得正确的语法(请参阅下面的错误)。我尝试了多种方法,包括引用脚本或尝试运行它bash -c。但每次我都会遇到解析错误。
完整的脚本是:
\n#!/usr/bin/env node\n\nconst semver = require('semver');\nconsole.log("Hello World! You're using " + process.version)\nRun Code Online (Sandbox Code Playgroud)\n错误:
\n在登录 shell 中(我不需要它)
\n\xe2\x9d\xaf bin/nodesample.js\nenv: [[: No such file or directory\nRun Code Online (Sandbox Code Playgroud)\n在非登录外壳中我想找到解决方案
\nenv: [[: No such file or directory\nRun Code Online (Sandbox Code Playgroud)\n … 我想从 shell 运行多个 Python 脚本。我用pythonDim.sh脚本来做同样的事情。
#!/usr/bin/python
/home/path_to_script/dimAO.py
/home/path_to_script/dimA1.py
/home/path_to_script/dimA2.py
/home/path_to_script/dimA3.py
Run Code Online (Sandbox Code Playgroud)
但它不起作用。怎么写shell脚本?
我是 bash 的新手,我想知道如何从路径打印最后一个文件夹名称。
mypath="/Users/ckull/Desktop/Winchester stuff/a b c/some other folder/"
dir="$(basename $mypath)"
echo "looking in $dir"
Run Code Online (Sandbox Code Playgroud)
其中dir是路径中的最后一个目录。它应该打印为
some other folder
Run Code Online (Sandbox Code Playgroud)
相反,我得到:
Winchester
stuff
a
b
c
some
other
folder
Run Code Online (Sandbox Code Playgroud)
我知道空格会导致问题;) 我是否需要将结果通过管道传输到字符串然后替换换行符?或者也许有更好的方法......
在 bash 脚本的开头使用#!/bin/bash 有什么意义?我们可以在没有#!/bin/bash 的情况下编写 bash 脚本吗?