Как функция / скрипт может сказать Xterm из терминологии?

Вы неправильно понимаете синтаксис команды printf (который близко следует синтаксису базовой функции C: см., Например, man 3 printf для полной документации).

printf принимает строку формата , состоящую из последовательности спецификаторов формата и других литеральных символов, за которыми следует столько разделенных запятыми аргументов, сколько необходимо для заполнения заданного формата. В вашей команде

printf "%s,%d,%0.2f%\n",c[i]"\t"a[i]"\t"100*b[i]/x"%"

вы говорите ему ожидать 3 значения (a %s, a %d и a %0.2f), но даете ему один объединенный строковый аргумент [119 ]. Следовательно, во время назначения у него закончатся аргументы.

Предположительно, вы предполагали

printf "%s\t%d\t%0.2f%%\n", c[i], a[i], 100*b[i]/x

(вкладки идут внутри строки формата; %% соответствует литералу %, т. Е. Не позволяет интерпретировать % как начало другого спецификатор формата).

4
задан 15.04.2020, 20:18

2 ответа

Вот еще один (более простой ИМО) способ сделать это. У меня нет просветления, поэтому я не могу проверить его по терминологии, но я проверял его с помощью gnome-Terminal, Terminator и Xterm.

terminalPID=$(ps -o ppid= $PPID) # get the script's parent's PID (the terminal)
processName=$(ps -p $terminalPID -o comm=) # get the terminal's name by it's PID
terminalName='gnome-terminal' # specify what process name you want to check for

# do the checking

if [ $processName == $terminalName ] ; then 
    echo "You are using gnome-terminal!"
else 
    echo "You are using something else!"
fi

Теперь, чтобы выяснить имя процесса вашего терминала, откройте ваш терминал и запустите

ps -p $PPID -o comm=

Это выведет имя процесса терминала (если, конечно, вы используете bash ).

Более полная версия, которая проверяет наличие нескольких различных эмуляторов терминала, которые я установил:

terminalPID=$(ps -o ppid= $PPID) # get the script's parent's PID (the terminal)
processName=$(ps -p $terminalPID -o comm=) # get the terminal's name by it's PID

# do the checking

if [ $processName == 'gnome-terminal' ] ; then 
    echo "You are using gnome-terminal!"
elif [ $processName == 'xterm' ] ; then
    echo "You are using xterm!"
elif [ $processName == '/usr/bin/termin' ] ; then
    echo "You are using Terminator!"
else 
    echo "You are using something else!"
fi
2
ответ дан 15.04.2020, 20:18

Я не знаю, является ли это «правильным» способом сделать это, но вы можете узнать, с какой командой был вызван родительский терминал, вызвав ps с идентификатором родительского процесса, полученным через встроенную оболочку $PPID, например

# get the shell's parent command from the PPID via ps
pcomm=$(ps -ocomm= $PPID)

Затем вы можете проверить значение командной строки - например, с помощью оператора case

# now do something based on the value of the parent terminal command
case "$pcomm" in
  "gnome-terminal")
  echo "parent is gnome-terminal"
  ;;
  "xterm")
  echo "parent is xterm"
  ;;
  "terminator")
  echo "parent is terminator"
  ;;
  *)
  echo "unknown parent terminal"
  ;;
esac
4
ответ дан 15.04.2020, 20:19

Теги

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