Когда они не заключаются в кавычки, $*
и $@
то же. Вы не должны использовать или их, потому что они могут повредиться неожиданно, как только у Вас есть аргументы, содержащие пробелы или подстановочные знаки.
"$*"
расширяется до отдельного слова "$1c$2c..."
. Обычно c
пространство, но это - на самом деле первый символ IFS
, таким образом, это может быть что-либо, что Вы выбираете.
Единственное хорошее использование, которое я когда-либо находил для него:
споры соединения с запятой (простая версия)
join1() {
typeset IFS=,
echo "$*"
}
join1 a b c # => a,b,c
споры соединения с указанным разделителем (лучшая версия)
join2() {
typeset IFS=$1 # typeset makes a local variable in ksh (see footnote)
shift
echo "$*"
}
join2 + a b c # => a+b+c
"$@"
расширяется для разделения слов: "$1"
"$2"
...
Это почти всегда, что Вы хотите. Это разворачивает каждый позиционный параметр до отдельного слова, которое делает это идеально подходящим для принятия параметров командной строки или аргументов функции и затем передачи их к другой команде или функции. И потому что это разворачивает двойные кавычки использования, это означает, что вещи не повреждаются если, скажем, "$1"
содержит пространство или звездочку (*
).
Давайте запишем названный сценарий svim
это работает vim
с sudo
. Мы сделаем три версии для иллюстрирования различия.
svim1
#!/bin/sh
sudo vim $*
svim2
#!/bin/sh
sudo vim "$*"
svim3
#!/bin/sh
sudo vim "$@"
Все они будут хорошо для простых случаев, например, единственного имени файла, которое не содержит пробелы:
svim1 foo.txt # == sudo vim foo.txt
svim2 foo.txt # == sudo vim "foo.txt"
svim2 foo.txt # == sudo vim "foo.txt"
Но только $*
и "$@"
работайте правильно, если у Вас есть несколько аргументов.
svim1 foo.txt bar.txt # == sudo vim foo.txt bar.txt
svim2 foo.txt bar.txt # == sudo vim "foo.txt bar.txt" # one file name!
svim3 foo.txt bar.txt # == sudo vim "foo.txt" "bar.txt"
И только "$*"
и "$@"
работайте правильно, если у Вас есть аргументы, содержащие пробелы.
svim1 "shopping list.txt" # == sudo vim shopping list.txt # two file names!
svim2 "shopping list.txt" # == sudo vim "shopping list.txt"
svim3 "shopping list.txt" # == sudo vim "shopping list.txt"
Так только "$@"
будет работать правильно все время.
typeset
то, как сделать локальную переменную в ksh
(bash
и ash
использовать local
вместо этого). Это означает IFS
будет восстановлен его предыдущему значению, когда функция возвратится. Это важно, потому что команды, которые Вы выполняете позже, не могли бы работать правильно если IFS
установлен на что-то нестандартное.
Значки находятся в/usr/share/icons, но корректный способ получить их зависит того, какие библиотеки - Вы использование, если PyQt существует метод для получения значка от текущей темы.
Проверьте это: https://stackoverflow.com/questions/12805036/qicon-fromtheme-not-displaying-icon-in-pyqt
Если Вы используете gtk, я предполагаю, что существует альтернатива, это - то, что говорит Google: