Псевдоним tcsh со сложными cmds, кавычками и аргументами cmd

Думаю, это можно сделать с помощью ssh. Взгляните на переадресацию соединений через ssh.

ssh -R remote_socket:host:hostport

Если, например, ваш веб-серверexample.com:

ssh -R 8081:localhost:8081 example.com

При запуске на вашем raspberry pi все соединения, указывающие на порт 8081 на вашем веб-сервере, перенаправляются через ssh на ваш raspberry pi.

Я рекомендую сначала попробовать это на другом хосте в вашей локальной сети, чтобы убедиться, что он соответствует вашим потребностям. Из малинового пи:

ssh -R 8081:localhost:8081 other_lan_host

В качестве альтернативы вы можете использовать параметр -Lи запустить команду с хоста локальной сети, который вы тестируете с помощью :

.
ssh -L 8081:raspberrypihost:8081
1
28.08.2018, 19:31
3 ответа

Попробуйте это:

$ alias median="sort -n|awk ' { a[i++]="\$1"; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'"

$ cat file_with_numbers| awk '{print $1}'|median
0
28.04.2021, 23:43

Если вы не хотите заново изобретать велосипед, вы также можете использовать GNUdatamash:

alias median 'datamash median 1'

datamashпредполагает столбцы с разделителями табуляции, хотя вы можете изменить разделитель с помощью -t.

Для вашей конкретной проблемы обратите внимание, что расширение $parameterв (t )csh выполняется в двойных кавычках, но в отличие от Bourne -, как и оболочки, его нельзя отключить с помощью обратной косой черты, поэтому вы нужно что-то вроде:

alias median "sort -n | awk '{a[NR]="\$"1}; END {x = int(NR/2); print NR % 2 ? a[x+1] : (a[x]+a[x+1])/2}'"

То есть выйти из двойных кавычек, чтобы ввести $как \$, или пойти с подходом Марка и использовать одинарные кавычки, но выйти из них, чтобы ввести буквальные одинарные кавычки.

1
28.04.2021, 23:43

Вы можете поместить в псевдоним последовательность команд из одной строки -, но вам может понадобиться добавить обратную косую черту и одинарные или двойные кавычки здесь и там. Но если вам не нужно вызывать псевдоним с параметрами или элементами из истории оболочки или вам нужно максимизировать скорость, иногда проще просто поместить последовательность команд в виде -в файл, пометить его как исполняемый и поместить куда-нибудь. в пути поиска($PATHили $path).

Но сделать псевдонимом следующее:

sort -n | awk '{ a[i++]=$1; } END { x=int((i+1)/2); if (x < (i+1)/2) print (a[x-1]+a[x])/2; else print a[x-1]; }'

Необходимо убедиться, что

  • оператор конвейера находится внутри строки, заключенной в кавычки; в противном случае команда псевдонима будет завершена
  • $либо находится внутри строки, заключенной в одинарные кавычки, либо находится вне какой-либо строки в кавычках, и ему предшествует\(спасибо, Стефан, за альтернативу)
  • нет вложенных одинарных кавычек

Не используйте \!:1для создания $1. \!:1будет использоваться, если вы передадите параметр своему псевдониму. Вы просто хотите, чтобы литерал $1был виден awk.

В этом случае безопаснее всего заключить как можно большую часть псевдонима в одинарные кавычки и использовать "только для заключения в одинарную кавычку. Вы увидите два вхождения "'"ниже.

ubuntu% alias median 'sort -n | awk '"'"'{ a[i++]=$1 ; } END { x=int ( ( i+1 ) /2 ) ; if ( x < ( i+1 ) /2 ) print ( a[x-1]+a[x] ) /2 ; else print a[x-1] ; }'"'"

ubuntu% seq 1 9 | median
5
2
28.04.2021, 23:43

Теги

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