Для меня эта проблема вызвана неправильным владением некоторыми папками и файлами в /usr.
root@mybox-01:~# ls /usr -la
total 152
drwxrwxr-x 11 501 501 4096 Nov 27 15:03 .
drwxr-xr-x 26 root root 4096 Dec 25 15:00 ..
drwxrwxr-x 2 501 501 57344 Dec 28 09:27 bin
drwxr-xr-x 2 root root 4096 Dec 25 19:45 games
drwxr-xr-x 35 root root 4096 Dec 25 19:45 include
drwxrwxr-x 167 501 501 36864 Dec 28 09:27 lib
drwxrwxr-x 3 501 501 4096 Nov 27 15:03 lib64
drwxrwsr-x 10 root staff 4096 Dec 24 18:34 local
drwxr-xr-x 2 root root 12288 Dec 28 09:27 sbin
drwxrwxr-x 278 501 501 12288 Dec 28 09:27 share
drwxr-xr-x 5 root root 4096 Dec 28 09:27 src
Исправление должно было выполняться chown root.root -R /usr
Тогда снова запустите файл VBoxManage extpack install <package> ..
Я не уверен, как это было вызвано, но я надеюсь, что «исправление» не сломает ничего в моей системе ..
Я предлагаю не хранить команды в массиве, а только параметры (спасибо @steeldriver для синтаксиса массива в bash):
#!/usr/bin/env bash
dirs=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for dir in "${dirs[@]}"; do
cd "$dir"
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Примечание: cd - (минус) изменяется на каталог (вместо родительского каталога), поэтому он безопаснее, чем cd ...
Если вы действительно хотите сохранить команды, вам необходимо выполнить элементы массива как команды, просто записав их:
#!/usr/bin/env bash
cmds=('cd dir1' 'cd dir2' 'cd dir3' 'cd dir4' 'cd dir5')
for cmd in "${cmds[@]}"; do
$cmd
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Обратите внимание, что теперь в скрипте есть асимметрия: последний cd - предполагает, что $cmd на самом деле является командой cd. Я бы не рекомендовал этого. Либо поместите обе команды в массив, либо ни один из них.
Я предлагаю не хранить команды в массиве, а только параметры (спасибо @steeldriver для синтаксиса массива в bash):
#!/usr/bin/env bash
dirs=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for dir in "${dirs[@]}"; do
cd "$dir"
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Примечание: cd - (минус) изменяется на каталог (вместо родительского каталога), поэтому он безопаснее, чем cd ...
Если вы действительно хотите сохранить команды, вам необходимо выполнить элементы массива как команды, просто записав их:
#!/usr/bin/env bash
cmds=('cd dir1' 'cd dir2' 'cd dir3' 'cd dir4' 'cd dir5')
for cmd in "${cmds[@]}"; do
$cmd
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Обратите внимание, что теперь в скрипте есть асимметрия: последний cd - предполагает, что $cmd на самом деле является командой cd. Я бы не рекомендовал этого. Либо поместите обе команды в массив, либо ни один из них.
Я предлагаю не хранить команды в массиве, а только параметры (спасибо @steeldriver для синтаксиса массива в bash):
#!/usr/bin/env bash
dirs=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for dir in "${dirs[@]}"; do
cd "$dir"
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Примечание: cd - (минус) изменяется на каталог (вместо родительского каталога), поэтому он безопаснее, чем cd ...
Если вы действительно хотите сохранить команды, вам необходимо выполнить элементы массива как команды, просто записав их:
#!/usr/bin/env bash
cmds=('cd dir1' 'cd dir2' 'cd dir3' 'cd dir4' 'cd dir5')
for cmd in "${cmds[@]}"; do
$cmd
echo "***MAKE STUFF***"
echo "***MAKE MORE STUFF***"
cd -
done
Обратите внимание, что теперь в скрипте есть асимметрия: последний cd - предполагает, что $cmd на самом деле является командой cd. Я бы не рекомендовал этого. Либо поместите обе команды в массив, либо ни один из них.
Я думаю, вам нужно сделать это так:
#!/usr/bin/env bash
# declare an array called array and define values
array=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for i in "${array[@]}"
do
cd "$i" || exit
#MAKE STUFF
#MAKE MORE STUFF
cd ..
done
Аналогичный вопрос уже задан (и ответил) о массивах в Bash: (https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash). [ ! d0]
Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -a (-a для массива):
# Array: list of strings (directories)
declare -a directories=("/bin" "/etc" "/usr")
# For each element in the array
for element in "${directories[@]}"
do
cd $element
## DO STUFF
done
Я думаю, вам нужно сделать это так:
#!/usr/bin/env bash
# declare an array called array and define values
array=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for i in "${array[@]}"
do
cd "$i" || exit
#MAKE STUFF
#MAKE MORE STUFF
cd ..
done
Аналогичный вопрос уже задан (и ответил) о массивах в Bash: (https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash). [ ! d0]
Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -a (-a для массива):
# Array: list of strings (directories)
declare -a directories=("/bin" "/etc" "/usr")
# For each element in the array
for element in "${directories[@]}"
do
cd $element
## DO STUFF
done
Я думаю, вам нужно сделать это так:
#!/usr/bin/env bash
# declare an array called array and define values
array=('dir1' 'dir2' 'dir3' 'dir4' 'dir5')
for i in "${array[@]}"
do
cd "$i" || exit
#MAKE STUFF
#MAKE MORE STUFF
cd ..
done
Аналогичный вопрос уже задан (и ответил) о массивах в Bash: (https://stackoverflow.com/questions/8880603/loop-through-an-array-of-strings-in-bash). [ ! d0]
Чтобы создать массив строк в Bash, вам нужно использовать ключевое слово declare, используя параметр -a (-a для массива):
# Array: list of strings (directories)
declare -a directories=("/bin" "/etc" "/usr")
# For each element in the array
for element in "${directories[@]}"
do
cd $element
## DO STUFF
done