是否可以创建命令,将其放在一个文件中并在没有“./”的情况下运行?

是否可以创建命令,将其放在一个文件中并在没有“./”的情况下运行?

如果我在这样的文件中创建脚本:

#!/bin/bash
echo "test"

据我所知(作为新手)是将其放在某个文件夹中,然后使其可执行

chmod +x myscript

然后使用类似以下命令执行它./myscript

如果我必须为我创建的每个命令创建文件,我认为这并不简单。我认为如果我可以将其放在一个文件中,然后使其可执行,而无需./在创建的每个命令前面添加,这会更简单。可能吗?

答案1

解决方案 1:Bash 函数

Bash 函数的行为与命令非常相似。例如,您可以将函数放入 ~/.bashrc 文件中,例如

hello() {
   echo Hello World!
}

然后,您可以像运行任何其他命令一样运行它,只要您从 shell 启动它,而不是从 cron 作业、init 脚本等启动它:

me@pc:~$ hello
Hello World!

解决方案 2:~/bin 目录

如果 ~/bin 目录存在,默认的 ~/.profile 文件会将其添加到您的路径中。因此,在您的主文件夹中创建一个 bin 目录,并将您的脚本放入该目录中。您仍然需要chmod +x在脚本上使用 ./,但不必在它们前面加上前缀 ./

创建 bin 目录后,不要忘记重新登录!

答案2

您需要添加./才能从本地目录中的脚本运行命令,因为名称中不包含 的命令/仅在值中提到的目录中查找$PATH。通常该值仅包含绝对路径,特别是不包含路径.,因此不会查看当前工作目录。这是一件好事,因为否则可能会有人试图通过将名称与常见命令匹配的脚本放置在某些目录中来诱骗用户无意中执行脚本ls;此外,仅当当前目录具有某些特定值时才使某些命令可见通常不太实用。

自然的解决方案是有一个特定的目录,将您想要调用的私有命令放在其中,并确保该目录的(绝对)名称出现在 中$PATH。此类目录的传统位置是$HOME/bin

答案3

我在我的~/.bashrc

alias ll='ls -lh'
alias li='ls -lhi'
alias lll='ls -lhL'
alias l='ll'
complete -F _longopt l ll lll li  # this doesn't actually work

psg(){ ps aux | grep ${*:-$USER} | grep -v grep; }
psgw(){ ps auxww | grep ${*:-$USER} | grep -v grep; }

# expand aliases for sudo
alias sudo='sudo '
alias imv='imv -i'
alias mv='mv -i'
alias cp='cp -i'
alias rm='rm -i'
alias prealloc-mv='rsync --remove-source-files --sparse --preallocate -aH'
alias m=less
export LESS=iMRj5
alias j='jobs -l'
alias dr='disown -r'

cmpll() { ll "$@"; cmp "$@" && echo identical; }
findll() { find "$@" -exec ls -dlh --color=auto {} +; }
findinamell() {
    local i  args=()
    for i in "$@";do
            args+=( '-iname' )
            args+=( "*$i*" )
    done
    findll "${args[@]}";
}

正如其他人指出的那样,默认情况下,如果存在,则~/bin位于您的目录中,因此您可以将对于别名或 shell 函数来说太大的内容放在那里。我的目录中实际上有几个非常小的脚本,我不知道为什么我决定将它们设为文件而不是别名。在 bash 手册页中搜索“命令执行”以获取有关如何解释命令的更多详细信息 。$PATH~/binman bash

如果我正在编写一些仅适用于我在某个目录中正在处理的命令,我可能会将这些命令放在那里的一个文件中,然后用 ./do-stuff.sh 运行它。你的手指会./很快习惯打字。你也可以保存一个文本文件,其中包含你使用过的有用命令以及它们的作用描述。有时我会这样做,因为我觉得不值得花时间将其变成一个接受参数的函数或脚本,而是直接粘贴并根据需要进行编辑。例如,为了播放有声读物,我经常使用:

mpl() { t=2200; mplayer -ss $(($t * ($1%2))) -endpos $(($t+5)) disc$(printf '%02d' $((1 + $1/2)))-38.mp3; date; }; mpl 4

(这将播放 2200 秒的音频,从开头(1 美元奇数)或 2200 秒开始,播放到众多编号音轨之一。基本上将线性索引映射到一组音频文件中,每个文件的长度为两个收听块。)

我可以在显示器关闭的情况下,按下向上箭头键并编辑命令行的末尾,即使我快要睡着了。我使用 shell 函数,因此我需要编辑的部分就在末尾。只有当所有参数都可以放在命令固定部分的末尾时,别名才有效。

我确信如果你用谷歌搜索的话会发现很多好东西,但也可能有很多过时和没那么有用的东西,而且我现在不想花时间去评价指南。

答案4

您始终可以在 bin 目录中将其取出。或者,假设它是位于 /home/user/Desktop/hello.sh 位置的 she 脚本,您可以打开 ~/.bashrc 并向其中添加

    hello() {
    '/home/user/Desktop/hello.sh'
    }

然后,您可以在终端中执行“hello”,它应该可以完美运行。

相关内容