Запуск программы из терминала, & ldquo; команда не найдена & rdquo;

Скрипт, а не функция. Это выводит количество символов в самом длинном имени файла, что я понял, что вы хотели:

#!/bin/bash

# include hidden files
shopt -s dotglob
# if the first argument is a directory
if [ -d "$1" ]; then
    # move to that directory
    cd "$1"
    # set a variable to 0
    long=0
    # loop over all the files
    for i in *; do
        # print the filename - remove this line after testing
        echo "$i"   
            # if the length of the current filename is longer 
            # than the value of the variable long, assign the
            # length of the current filename to long 
            (( (${#i} > $long) )) && long=${#i}
    done
        # print the value of long
        echo $long
    # if the first argument wasn't a directory, print an error
    else
        printf "%s\n" "Not a directory"
fi

Это использует настройку dotglob, что приводит к тому, что с помощью * включение скрытых файлов , Чтобы увидеть его эффект, запустите эти команды в своем домашнем каталоге:

ls -d *
shopt -s dotglob
ls -d *

Чтобы отключить настройки shopt, используйте -u, например shopt -u dotglob.

Нам нужно проверить, что аргумент является каталогом, поэтому мы используем команды if и test (в форме [), которая имеет тест для каталогов, -d:

if [ -d "$1" ]; then
[d4 ] это означает, что если первый аргумент, переданный скрипту, является именем существующей директории, то выполните следующее. $1 является первым аргументом, и мы заключим его в двойные кавычки, чтобы остановить выполнение оболочки дополнительными расширениями для значения переменной.

Нам нужно зайти в каталог, потому что нам нужно получить длина имени файла, а не весь путь (абсолютный или относительный). Мы не хотим этого:

$ for i in ~/*; do [ -d "$i" ] && echo "$i"; done
/home/zanna/custom
/home/zanna/Desktop
/home/zanna/Documents
/home/zanna/Downloads
...

, потому что, если мы сосчитаем длину $i, мы получим длину полного пути. Мы могли бы сделать некоторые текстовые обработчики (и, возможно, некоторые умные трюки, которых я не знаю), чтобы избавиться от пути, но разбор имен файлов обычно ненадежный, и если мы сменим каталог, мы сможем легко заставить оболочку подсчитывать символы для нас, используя [ f17], чтобы указать длину var (я считаю, что это количество символов, а не байтов). Обратите внимание, что скрипты выполняются в дочерней оболочке, а не в текущей оболочке, поэтому, если скрипт меняет каталог, рабочий каталог оболочки, вызывающей сценарий, не затрагивается.

В моем скрипте используется for для перебора файлов в каталоге. Линией, выполняющей работу, является

(( (${#i} > $long) )) && long=${#i}

Это означает, что если длина текущего значения i больше текущего значения long, тогда назначьте длину i к long. Поскольку мы сначала установили long в 0, первое имя файла всегда будет длиннее long (потому что оно как можно короче). После этого только длина более длинных имен файлов сможет заменить значение long. Поскольку мы знаем, что ${#i} и long будут содержать только целые числа, нам не нужно защищать их двойными кавычками. (( создает арифметический контекст в Bash, поэтому мы можем использовать > с его математическим значением (спасибо муру за указание на это в другом месте).

2
задан 9 February 2018 в 02:19

3 ответа

Если вы наберете команду

echo $PATH

, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».

Самый простой способ запускать команды в вашем текущем каталоге:

./nuetrino_s1_1

[ f3] указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].

1
ответ дан 22 May 2018 в 13:13
  • 1
    Вы можете добавить " " к вашему $ PATH (поэтому он ищет ваш present.working.directory для команд), который сначала чувствует себя прекрасно, поскольку вам больше не нужно вводить «./ command», но по моему опыту вы будете спотыкаться о нем на других машинах которые этого не делают; так что вы в конечном итоге напечатаете ". / command " даже если ". " находится в пути. то есть. мой 2c просто учится печатать ./command – guiverc 9 February 2018 в 02:32
  • 2
    Добавление ". & Quot; до $ PATH - это действительно НЕОБХОДИМАЯ идея. Это позволяет совершать любые виды атак (например, если вы положите их первым, каждый может захватить ваш сеанс, указав «ls» или другую программу в каталоге, в котором вы оказались. Или даже если вы поместили его последним, где есть обычная программа опечаток («sl» «gerp» и т. д.), а также множество других плохих побочных эффектов безопасности в дополнение к этим. НЕ помещайте «.» в свой $ PATH. – Olivier Dulac 23 March 2018 в 21:49

Если вы наберете команду

echo $PATH

, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».

Самый простой способ запускать команды в вашем текущем каталоге:

./nuetrino_s1_1

./ указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].

1
ответ дан 17 July 2018 в 21:15

Если вы наберете команду

echo $PATH

, она отобразит ваш путь к команде или где будут найдены команды. Ваш текущий каталог будет отображаться как «.».

Самый простой способ запускать команды в вашем текущем каталоге:

./nuetrino_s1_1

./ указывает системе на поиск команды в текущем каталоге [или $ PWD или present.working.directory].

1
ответ дан 23 July 2018 в 21:54

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

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