Объединить две команды, определенные как String, в переменной и запустить как одну

Бессмысленно говорить о «промежутках между аргументами»; это концепция оболочки.

Работа оболочки состоит в том, чтобы брать целые строки ввода и формировать из них массивы аргументов для запуска команд. Это может включать синтаксический анализ строк в кавычках, расширение переменных, подстановочные знаки файлов и выражения тильды и многое другое. Команда запускается стандартным системным вызовом exec, который принимает вектор строк.

Существуют и другие способы создания вектора строк. Многие программы разветвляют и выполняют свои собственные подпроцессы -с предопределенными вызовами команд -, и в этом случае никогда не существует такой вещи, как "командная строка". Точно так же графическая оболочка (рабочего стола )может запустить процесс, когда пользователь снова перетащит значок файла и поместит его на командный виджет -, нет текстовой строки для символов «между» аргументами.

Что касается вызванной команды, то, что происходит в оболочке или другом родительском/предшественнике процессе, является частным и скрытым -мы видим только массив строк, который стандарт C указывает, что main()может принять.

1
31.01.2020, 14:46
2 ответа

Возможно, вам не следует так поступать. В зависимости от того, чего вы на самом деле пытаетесь достичь, возможны и другие варианты :

.

Если вы просто пытаетесь получить динамическую опцию для выбора строки поиска, вы можете вместо этого сделать что-то вроде этого:

#!/bin/bash
pattern=$1

ls -alt | grep "${pattern:-.}"

Это будет искать любой ваш первый позиционный параметр или любой другой, если он не указан.

Или если вы пытаетесь действовать на каком-то условии:

#!/bin/bash

cmd=(ls -alt)
p1=usersfile
p2=usersfolder

if [[ condition1 ]]; then
    p=$p1
elif [[ condition2 ]]; then
    p=$p2
fi

"${cmd[@]}" | grep "$p"

Или в функции:

#!/bin/bash

ls_func () {
    local p=$1
    ls -alt | grep "${p:-.}"
}

while getopts p:c: opt; do
    case $opt in
        c)  command=$OPTARG;;
        p)  pattern=$OPTARG;;
    esac
done

if [[ $command == 'ls' ]]; then
    ls_func "$pattern"
fi
1
28.04.2021, 23:25

Да, вы можете сделать это с помощью eval.

$ var="ls -alt"
$ var2="| grep usersfile"
$ var3="| grep usersfolder"
$ eval "$var$var2"
< Output of ls -alt | grep userfile >
$ eval "$var$var3"
< Output of ls -alt | grep usersfolder >
2
28.04.2021, 23:25

Теги

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