Я нашел записи:
mimeopen, когда среда рабочего стола не указана, сохраняет записи в:
$HOME/.local/share/applications/defaults.list
Ваша команда 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"