Bash скрипт не может найти команду при цитировании

Я нашел записи:

mimeopen, когда среда рабочего стола не указана, сохраняет записи в:

$HOME/.local/share/applications/defaults.list

3
14.09.2017, 21:27
1 ответ

Ваша команда run, вероятно, ожидает выполнения команды, а не кода оболочки для оценки (редактирования теперь, когда вы его опубликовали :да, это так, это"$@")

Если эта команда runна самом деле является сценарием оболочки, она может принимать встроенные команды, такие какeval(edit :да, она принимает ), и в этом случае вы сможете:

./run eval 'git status && npm install'

(этот код будет оцениваться в контексте скрипта run, что может иметь неожиданные последствия, если он изменяет некоторые внутренние переменные скрипта, например (например,./run eval 'PATH=/none;...')(изменить :не здесь, так как это последний запустить команду в подоболочке )).

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

./run sh -c 'git status && npm install'

Здесь,Я бы также использовал переменную массива для хранения списка путей вместо того, чтобы хранить его в скалярной переменной и полагаться на оператор split+glob для его разделения. Вы также можете сообщить об ошибках в статусе выхода

.
#!/bin/bash -
paths=(/Users/guy/project /Users/guy/project-2)
ret=0

for i in "${paths[@]}"; do
  (cd -P -- "$i" && "$@") || ret=$?
done
exit "$ret"

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

#!/bin/bash -
paths=(/Users/guy/project /Users/guy/project-2)
ret=0

for i in "${paths[@]}"; do
  (cd -P -- "$i" && eval "$@") || ret=$?
done
exit "$ret"

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

./run git add "$file"

, что может быть скрытой уязвимостью внедрения команд (, например, когда $fileравноfoo;reboot).

./run eval "git add $file"

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

Чтобы это не было уязвимостью внедрения команд, с вариантомrunне с использованиемeval:

./run git add "$file"

или используя eval, но со статическим кодом и передачей динамического значения через переменную окружения.

FILE=$file./run eval 'git add "$FILE" && git commit -m blah'

или используя sh -c, но со статическим кодом и передачей динамического значения через аргумент.

./run sh -c 'git add "$1" && git commit -m blah' sh "$file"
6
27.01.2020, 21:13

Теги

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