通常,bash 能够分配命令的多行输出:
L=`ls`
Run Code Online (Sandbox Code Playgroud)
这适用于交互式 shell 和脚本。但似乎无法在变量中捕获内置函数的输出:
L=`dirs -l -p`
Run Code Online (Sandbox Code Playgroud)
这在交互式 shell 中有效,但在脚本中只有第一行在变量中结束,可能是由于 bash 对内置函数的不同处理。
为什么会发生这种情况,我该如何做我需要的事情?
我知道pwd给出当前工作目录,hostname给出当前主机并whoami给出当前用户。是否有一个unix命令可以给我输出
whoami@hostname:pwd
Run Code Online (Sandbox Code Playgroud)
以便我可以快速将输出粘贴到scp命令中?
我在玩一些可执行文件的名称,将它们放在一个文件夹中~/bin,该文件夹位于我的$PATH. 现在我想知道如何设置bash-3.2终端的首选项,以便它选择这些可执行文件而不是要执行的内置程序或别名。
例如,如果我将一个名为的脚本放在cd中的目录中$PATH,cd则仍会执行内置的 for 。但是,如果我创建一个aliasfor cd,那么这个别名将被执行,覆盖内置函数。
$ type cd
cd is a shell builtin
Run Code Online (Sandbox Code Playgroud)
有没有办法让可执行文件在$PATH默认情况下优先于内置的shell,只执行,例如cd,不必求助于使用命令builtin或command?
我也对任何讨论这种偏好的官方参考资料感兴趣(不是我理解的推理)。
注意:这个问题纯粹是出于个人教育目的,我想知道为什么它会这样工作。
我正在玩type和which命令,我发现了一些奇怪的东西。
type或者返回的路径或者说,一个命令是一个bash内置的。
which要么返回内置插件,如路径或没有exit或type
奇怪的是,type echo说 echo 是我预期的内置。
但是which echo将 /bin/echo 作为 echo 可执行文件的路径。对于任何其他内置命令,这似乎不会发生。
我想知道两者之间的区别是什么,Bash 选择在脚本和命令行中执行哪一个,以及这两个回声背后的故事是什么。
我的系统是 Ubuntu Desktop 12.04
如何检查命令是否是 的内置命令ksh?
在tcsh你可以使用where; 在zsh和bash您可以使用type -a; 在某些现代版本中,ksh您可以使用whence -av.
我想要做的是编写一个isbuiltin在任何版本ksh(包括ksh88和任何其他“旧”版本ksh)中工作的函数,其行为如下:
0如果所有给定的命令都是内置的,则返回(成功)1(失败)并将消息打印到 stderr。我已经有这样的工作功能zsh并bash使用上述命令。
这是我的目的ksh:
isbuiltin() {
if [[ "$#" -eq 0 ]]; then
echo "Usage: isbuiltin cmd" >&2
return 1
fi
for cmd in "$@"
do
if [[ $cmd = "builtin" ]]; then
#Handle the …Run Code Online (Sandbox Code Playgroud) 我通过键入 查找了 shell 内置命令集help set,简短的语法说明显示:
设置 [-abefhkmnptuvxBCHP] [-o 选项名称] [--] [arg ...]
帮助文档解释说,变量 $- 保存使用 set 命令设置的所有当前参数。
所以,我确实echo $-显示了 shell 的所有参数设置,我的是:
他BH
文档和上面的简短语法描述中提到了所有字母,但缺少一个:i选项。i setbash中的参数是什么意思?
由于工作环境的原因,我只能在 CentOS 上的 tcsh 中执行此操作。执行时find . -type f -executable -exec source '{}' \;,唯一的结果是find: 'source': No such file or directory针对每个适当的文件。不知道为什么这在 tcsh 中不起作用,因为它非常简单。我究竟做错了什么?非常感谢任何帮助。
我最近遇到了 command where,它提供了 Linux 中可执行文件的实际路径。我知道which, whereis,locate和 find,但没有where。
我想知道这个命令是什么时候引入的,为什么它的手册不可用。这个 shell 命令是特定于 C Shell 的还是所有 shell 都有这个where命令?
该/usr/bin/printfUTIL参数列表的长度被限制在外壳的最大命令行长度(即 getconf ARG_MAX,我的系统上会是2097152); 例子:
# try using a list that's way too long
/usr/bin/printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1
Run Code Online (Sandbox Code Playgroud)
输出:
bash: /usr/bin/printf: Argument list too long
Run Code Online (Sandbox Code Playgroud)
今天我被告知shell内置 printf没有这个限制;测试:
printf '%s\n' $(seq $(( $(getconf ARG_MAX) * 2 ))) | tail -1
Run Code Online (Sandbox Code Playgroud)
输出:
4194304
Run Code Online (Sandbox Code Playgroud)
问题:
略读man bash dash一下似乎并没有说明builtin 的 这种优势printf。凡被它记录?
难道内置 printfS(例如 bash)在字符的参数列表最大长度,如果是这样,那是什么长度?
$ bash --version
GNU bash, version 4.4.19(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.$ which read
/usr/bin/read
$ which read
/usr/bin/read
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么下面的示例 1 有效而示例 2 无效吗?
这个:
declare data
data="pig,cow,horse,rattlesnake,"
declare -a my_array
IFS=',' read -r -a my_array <<< "$data"
for item in …Run Code Online (Sandbox Code Playgroud)