Можно ли создавать команды, помещать их в один файл и запускать без «./»? [дубликат]

На этот вопрос уже есть ответ здесь:

Если я создам сценарий в файле вроде этого:

#!/bin/bash
echo "test"

Насколько я знаю (как новичок), это поместить его в какую-то папку, затем сделать его исполняемым с помощью

chmod +x myscript

, а затем выполнить его с помощью чего-то вроде ./ myscript .

Я думаю, что это непросто, если мне придется создавать файл для каждой создаваемой мной команды. Думаю, будет проще, если я смогу просто поместить его в один файл, а затем сделать его исполняемым, не добавляя ./ перед каждой созданной мной командой. Возможно ли это?

4
задан 11 January 2015 в 07:49

4 ответа

Решение 1: функции Bash

функции Bash ведут себя почти такие же как команды. Можно поместить функции в - например - ~/.bashrc файл, как

hello() {
   echo Hello World!
}

Тогда можно выполнить это как любая другая команда, пока Вы запускаете его со своей оболочки, а не с задания крона, init сценарий и т.д.:

me@pc:~$ hello
Hello World!

Решение 2: ~ / каталог bin

, значение по умолчанию ~/.profile файл добавляет ~ / каталог bin к Вашему пути, если тот каталог существует. Поэтому создайте каталог bin в своей домашней папке и поместите свои сценарии в тот тот каталог. Все еще необходимо использовать chmod +x на сценариях, но Вы не должны снабжать префиксом их. /

не забывают повторно входить в систему после создания каталога bin!

10
ответ дан 23 November 2019 в 11:39

Необходимо добавить ./ к командам выполнения из сценариев в локальном каталоге, потому что команды, которые не содержат / на их имя, ищутся только в каталогах, упомянутых в эти $PATH значение. Обычно то значение содержит только полные пути, и в особенности не содержит путь ., так, чтобы на текущий рабочий каталог не смотрели. Это - Хорошая Вещь, потому что иначе можно было попытаться обмануть пользователей в выполняющиеся сценарии, не намереваясь сделать так путем размещения сценариев с именами, соответствующими общим командам такой как ls в определенных каталогах; также это не обычно очень практично для создания определенных команд только видимыми, когда текущий каталог имеет некоторое определенное значение.

естественное решение состоит в том, чтобы иметь определенный каталог, были Вы, помещают частные команды, которые Вы хотите быть в состоянии назвать и гарантировать, что (абсолютное) название того каталога происходит в $PATH. Традиционное место для такого каталога $HOME/bin.

4
ответ дан 23 November 2019 в 11:39

Я имею набор псевдонимов и окружаю функции, определяемые в моем ~/.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 находится в Вашем $PATH по умолчанию, если он существует, таким образом, можно поместить вещи, которые являются слишком большими для псевдонима или окружают функцию там. У меня на самом деле есть несколько действительно маленьких сценариев в моем ~/bin, IDK, почему я решил сделать их файлами вместо псевдонимов. Поиск "ВЫПОЛНЕНИЯ КОМАНДЫ" в странице справочника удара для получения дополнительной информации о том, как интерпретируются команды. man 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

(это играет 2 200 секунд аудио, запускающегося в любом начало (нечетный 1$), или 2 200 секунд в, к одной из многих пронумерованных дорожек. В основном отобразите линейный индекс в ряд звуковых файлов, которые являются каждым два блока слушания долго.)

я могу стрелка вниз и редактировать самый конец командной строки с моим монитором прочь, в то время как я заснул. Я использую функцию оболочки, таким образом, первая часть должна отредактировать, является правильным в самом конце. Псевдонимы только работают, если все аргументы могут пойти прямо в конце фиксированной части команды.

я уверен, что существует тонна хорошего материала там, если Вы гуглите, но существует, вероятно, тонна устаревших и менее - полезный материал также, и я не хочу занимать время для оценки руководства прямо сейчас.

0
ответ дан 23 November 2019 в 11:39

Вы можете всегда он в каталоге bin. Или, скажем, это - она сценарий в местоположении/home/user/Desktop/hello.sh, можно открыть ~/.bashrc и добавить к нему

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

Затем можно выполниться 'привет' в терминале, и это должно работать отлично.

0
ответ дан 23 November 2019 в 11:39

Другие вопросы по тегам:

Похожие вопросы: