Como aliasar um comando com '

3

Eu queria fazer um apelido para desligar o caps:

python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'

Eu escrevi isso no meu .zshrc:

alias caps='python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)' '

Mas parece que o problema é que tenho ' no comando (por isso, cria um alias para uma parte dele).

Eu tentei usar:

alias caps=" python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)' "

para ver se algo mudou e recebo o erro de sintaxe do python.

Então, como posso criar um alias para uma linha com ' dentro?

    
por jinawee 21.02.2014 / 16:29

3 respostas

2

Você precisa escapar das aspas duplas no script python:

alias caps="python -c 'from ctypes import *; X11 = cdll.LoadLibrary(\"libX11.so.6\"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)' "

Claro, você também pode salvá-lo como um script python e, em seguida,

alias caps='path/to/script.py' 
    
por 21.02.2014 / 16:36
1

Em geral, a maneira fácil de citar uma string (como um comando shell) que pode conter caracteres arbitrários é:

  • Substitua todas as aspas simples ' na string pela sequência de 4 caracteres '\'' .
  • Coloque aspas simples em '…' ao redor da string.

Consulte Envolvendo um comando que inclui aspas simples e duplas para outro comando para mais detalhes.

Assim (com uma otimização no último caractere que é uma simples citação):

alias caps='python -c '\''from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'\'

No entanto, em vez de se debruçar sobre essas complexidades, basta fazer uma função.

caps () {
  python -c 'from ctypes import *; X11 = cdll.LoadLibrary("libX11.so.6"); display = X11.XOpenDisplay(None); X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0)); X11.XCloseDisplay(display)'
}

Ou crie um script .

    
por 23.02.2014 / 00:41
0

Use uma função ou crie um script.

caps() python -c '
from ctypes import *
X11 = cdll.LoadLibrary("libX11.so.6")
display = X11.XOpenDisplay(None)
X11.XkbLockModifiers(display, c_uint(0x0100), c_uint(2), c_uint(0))
X11.XCloseDisplay(display)'
    
por 21.02.2014 / 16:54