首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash缺少所有shell命令

Bash缺少所有shell命令
EN

Stack Overflow用户
提问于 2018-01-06 15:35:33
回答 1查看 1.1K关注 0票数 1

我正试图把男朋友的旧电脑转换成一个开发环境,因为我的电脑坏了,我买不起一台新的电脑,但它似乎失去了我习惯的每一个shell命令。它连ls都没有!

help命令提供了以下内容:

代码语言:javascript
复制
bash-4.4$ help
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin17.0.0)
These shell commands are defined internally.  Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.

A star (*) next to a name means that the command is disabled.

 job_spec [&]                            history [-c] [-d offset] [n] or hist>
 (( expression ))                        if COMMANDS; then COMMANDS; [ elif C>
 . filename [arguments]                  jobs [-lnprs] [jobspec ...] or jobs >
 :                                       kill [-s sigspec | -n signum | -sigs>
 [ arg... ]                              let arg [arg ...]
 [[ expression ]]                        local [option] name[=value] ...
 alias [-p] [name[=value] ... ]          logout [n]
 bg [job_spec ...]                       mapfile [-d delim] [-n count] [-O or>
 bind [-lpsvPSVX] [-m keymap] [-f file>  popd [-n] [+N | -N]
 break [n]                               printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]       pushd [-n] [+N | -N | dir]
 caller [expr]                           pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...)>  read [-ers] [-a array] [-d delim] [->
 cd [-L|[-P [-e]] [-@]] [dir]            readarray [-n count] [-O origin] [-s>
 command [-pVv] command [arg ...]        readonly [-aAf] [name[=value] ...] o>
 compgen [-abcdefgjksuv] [-o option] [>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] >  select NAME [in WORDS ... ;] do COMM>
 compopt [-o|+o option] [-DE] [name ..>  set [-abefhkmnptuvxBCHP] [-o option->
 continue [n]                            shift [n]
 coproc [NAME] command [redirections]    shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=v>  source filename [arguments]
 dirs [-clpv] [+N] [-N]                  suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid >  test [expr]
 echo [-neE] [arg ...]                   time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [na>  times
 eval [arg ...]                          trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [argume>  true
 exit [n]                                type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or ex>  typeset [-aAfFgilnrtux] [-p] name[=v>
 false                                   ulimit [-SHabcdefiklmnpqrstuvxPT] [l>
 fc [-e ename] [-lnr] [first] [last] o>  umask [-p] [-S] [mode]
 fg [job_spec]                           unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMAND>  unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMAN>  until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name >  variables - Names and meanings of so>
 getopts optstring name [arg]            wait [-n] [id ...]
 hash [-lr] [-p pathname] [-dt] [name >  while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]               { COMMANDS ; }

找.bashrc和.profile在~,我找不到它。我不想破坏整个过程,我从我的旧计算机上得到了一个优化的bash配置文件,但是它显然是假设命令来自几乎所有其他mac命令提示符。有什么好办法让一切都好起来睡觉吗?这只小狗是一个Macbook Pro从2012年年中,但运行高塞拉利昂10.13。

EN

回答 1

Stack Overflow用户

发布于 2018-01-08 03:24:14

这个纯bash代码不使用外部实用程序(因此应该运行),并将列出几个标准目录中可用的命令名:

代码语言:javascript
复制
for f in /tmp/num* ; do echo > $f ; done
for f in /bin/* /usr/bin/* /sbin/* /usr/sbin/* ; do \
    test -x "$f" && { n="${f##*/}" ; echo "$n" >> /tmp/num${#n} ; }
done
for f in /tmp/num{1..10} ; do printf %$((${f##*num}+1))s $(<$f) ; done ; echo

输出有点奇怪,(试试!)使用纯bash,没有像sortcolumn等外部实用程序来提高输出的可读性,而且由于让bash模拟那些实用程序很痛苦,所以我决定将所有一个字母的可执行文件放在一起,然后列出两个字母的可执行文件,然后是三个字母的可执行文件等等,长达10个字母。在任何系统中,通常都有许多名称大于10个字母的实用程序,但是列出的这些功能应该足以使事情变得正确。

为什么要这么做?它让有一个坏掉的$PATH的用户看到一切都不是没有希望的。或者在少数情况下,如果它失败了,那么它就证明了事情确实处于糟糕的状态。

在查看了生成的命令转储之后,假设修复事物所需的实用程序都在那里。下面是一个纯bash函数来获取它们的完整路径名:

代码语言:javascript
复制
findcommand() { printf "%s\n" /bin/* /usr/bin/* /sbin/* /usr/sbin/* |
                while read x ; do 
                   for f in $@ ; do 
                      [ "${x##*/}" = "$f" ] && echo $x
                done ; done ; }

用法,假设我们确实需要sortcolumnls和文本编辑器:

代码语言:javascript
复制
findcommand sort column ls vi jed mcedit 

在我的Lubuntu系统上输出:

代码语言:javascript
复制
/bin/ls
/usr/bin/column
/usr/bin/mcedit
/usr/bin/sort
/usr/bin/vi

注意,由于没有安装jed,所以它没有路径名。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48128871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档