问题标签 [dash-shell]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
shell - 如何找到以破折号为来源的脚本的路径?
我试图让一个源 shell 脚本确定它自己的位置,我发现这对于 dash 来说是一项艰巨的任务。
在 bash、sh 和 csh 中,我可以使用:$_
.
在鱼中,我可以使用(status -f)
.
在短跑中,我没有运气......
我已尝试使用以下结果获取下面显示的 path.sh 文件:
dash -c ". path.sh"
输出:
如何在破折号中获取 path.sh 的路径?
bash - 运行 echo 并使用 dash shell 将其重定向到 cat
我想要使用 python 代码创建一个压缩文件。但是,当我在 Makefile 中运行它时,它使用默认的 shell(破折号)。是个
但是在 bash 中它运行得非常好
有没有什么方法可以表达cat <(echo '#!/usr/bin/env python') - in dash ?
我知道我可以添加到 Makefile
但这只是解决方法,而不是永久解决方案。
bash - 使用命令 `echo -ne "hello\n"` 的 Bash 与 Dash 行为
echo -ne "hello\n"
使用 bash 和破折号的相同命令,我得到了不同的行为。见下文 :
这是为什么 ?完全看不懂……</p>
我的系统:
linux - Bash 和 Dash 不一致地使用 `errexit` 检查命令替换错误代码
我似乎遇到了一个非常非常奇怪的不一致方式,dash
并使用该选项bash
检查错误情况。errexit
使用dash
和bash
不使用set -e
/set -o errexit
选项,以下程序:
将打印以下内容(对于 的错误字符串略有不同dash
):
使用该errexit
选项,它将打印以下内容:
然而,令人惊讶的是,如果bar
是local
,程序将始终echo
同时具有pre
和post
。更具体地说,同时使用dash
和bash
不使用我们的errexit
选项,以下程序:
将打印以下内容:
换句话说,似乎没有检查分配给局部变量的命令替换的返回值errexit
,但如果变量是全局的,则检查。
如果两个外壳都没有发生这种情况,我会倾向于认为这只是一个极端情况下的错误。由于dash
专门设计为符合 POSIX 标准,我想知道这种行为是否实际上是由 POSIX 标准指定的,尽管我很难想象这将如何有意义。
dash(1)
有这个要说的errexit
:
如果不是交互式的,如果任何未经测试的命令失败,则立即退出。如果命令用于控制
if
、elif
、while
或until
; ,则认为命令的退出状态是经过显式测试的。或者如果命令是“&&”或“||”的左侧操作数 操作员。
bash(1)
有点冗长,但我很难理解它:
如果 a
pipeline
(可能由单个simple command
)、 alist
或 acompound command
(见SHELL GRAMMAR
上文)以非零状态退出,则立即退出。while
如果失败的命令是紧跟在oruntil
关键字之后的命令列表的一部分、在if
or保留字之后的测试的一部分、在or列表elif
中执行的任何命令的一部分(除了最后or之后的命令),则 shell 不会退出管道中的命令但最后一个,或者如果命令的返回值与. 如果子 shell 以外的复合命令由于命令在被忽略时失败而返回非零状态,则 shell 不会退出。一个陷阱&&
||
&&
||
!
-e
ERR
,如果设置,则在 shell 退出之前执行。此选项分别适用于 shell 环境和每个子 shell 环境(见COMMAND EXECUTION ENVIRONMENT
上文),并可能导致子 shell 在执行子 shell 中的所有命令之前退出。如果复合命令或 shell 函数在
-e
被忽略的上下文中执行,则在复合命令或函数体中执行的任何命令都不会受到-e
设置的影响,即使-e
设置了并且命令返回失败状态。如果复合命令或 shell 函数在被忽略-e
的上下文中执行时-e
设置,则在复合命令或包含函数调用的命令完成之前,该设置将不起作用。
linux - 从 tcsh 更改为 bash?
我在使用一些 shell 命令时遇到了困难,并认为这是由于我的 shell 设置为 BASH 失败所致。
以下命令解决了我的问题:
或者只需键入
因此,我似乎需要将我的 shell 重新配置为 bash,这应该很简单。我的默认 $SHELL 变量是 /bin/bash
我认为这是由于我的终端首选项下的以下设置:
为什么要将我的 shell 首选项设置为此,tcsh 相对于 bash 的优势/用途是什么?
另外,我应该如何克服这个问题,同时仍然保留使用可能依赖于此默认终端首选项 (/bin/tcsh) 的任何功能
这是我的一些系统信息:
我之前使用以下命令从 DASH 更改为 BASH:
我以前也使用过以下命令:
dash-shell - 如何使用破折号从 sqlite 数据库中读取?
在 bash 中,我使用它从 sqlite 数据库中读取:
不幸的是,这不适用于破折号 - 有没有办法?
bash - 当WORD是变量时,为什么在`case WORD in`语句中不会出现WORD的字段拆分?
外壳脚本:
执行此bash
操作会导致以下输出和错误。
执行此操作dash
:
我不明白为什么第一个case
语句成功但第二个语句没有。
根据http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_05上的 POSIX 文档,在任何一种情况下都会发生字段拆分,因此 after在第一个语句$a
中扩展为,它应该是等效的到第二个。foo bar
case
所以两者都应该失败。为什么第一个case
语句成功?
bash - 允许 shell 脚本只修改包含目录
我正在编写一个 posix 恭维 shell 脚本,除其他外,它将克隆一个 git 存储库,然后在存储库中执行一个脚本(与存储库一起克隆)。
例如:
git clone git@github.com:torvalds/linux.git
cd linux
./Kconfig
这个想法是人们会用它来做好事,而不是做坏事,但你知道......所以我真的想阻止人们做这样的事情:
rm -rf /
剧本里面。
或者也许是稍微不那么邪恶的东西,比如:
rm -rf ../../
我是否可以以某种方式更改脚本的权限(在克隆之后),以便它只能修改克隆存储库中的内容?
arrays - 符合 POSIX 的 shell 中的数组
根据hyperpolyglot.org 上的这个参考表,可以使用以下语法来设置数组。
但是我收到一个错误,破折号是 Ubuntu 上的默认设置/bin/sh
,应该符合 POSIX。
参考表是否具有误导性或错误性?
如果是,那么定义数组或列表并符合 POSIX 的正确方法是什么?
bash - LD_PRELOAD 不适用于通过 DASH 中的 system() 给出的命令,但使用 BASH
我正在使用 LD_PRELOAD,并且在使用 system() 命令时看到了 bash 和 dash 之间的区别。
让我们考虑这个简单的 C 程序:
我会像这样开始我的测试程序:
在 bash 和 dash 中,我得到了:
到目前为止一切都很好,除了当 dash 是 shell 时 LD_PRELOAD 不应用于给系统的命令。我是说
- 如果 /bin/sh 指向 /bin/bash,则 LD_PRELOAD 应用于给 system() 的命令
- 如果 /bin/sh 指向 /bin/dash,则 LD_PRELOAD 不会应用于给 system() 的命令。
我的 preload.so 库覆盖 open()。它在使用 bash 时与测试程序一起执行(/bin/sh=/bin/bash),但在使用 dash 时不执行(/bin/sh=/bin/dash)。
我猜 bash 和 dash 可能会以不同的方式处理传递给 execve 的环境变量,但我找不到用 dash 将 LD_PRELOAD 应用于给系统的命令的方法......不幸的是,我必须使用 dash,而使用 bash 是不是一个选择。