[{"data":1,"prerenderedAt":3555},["ShallowReactive",2],{"doc:\u002Fterminal":3},{"id":4,"title":5,"body":6,"description":3548,"extension":3549,"meta":3550,"navigation":2151,"path":3551,"seo":3552,"stem":3553,"__hash__":3554},"docs\u002Fterminal.md","Terminal y Bash",{"type":7,"value":8,"toc":3520},"minimark",[9,14,18,23,26,80,83,94,117,132,136,160,215,229,232,260,265,360,365,369,372,421,424,493,550,554,603,606,695,699,810,839,843,918,934,938,978,984,990,1060,1063,1120,1149,1166,1170,1173,1239,1242,1336,1347,1425,1435,1456,1460,1515,1518,1589,1600,1604,1607,1655,1661,1690,1697,1751,1754,1782,1792,1796,1850,1860,1889,1892,1908,1912,1919,1930,1946,1949,1972,1975,1989,1993,2013,2056,2059,2063,2130,2227,2233,2237,2305,2414,2427,2438,2486,2490,2605,2608,2657,2666,2670,2727,2733,2737,2744,2977,2980,3004,3007,3094,3106,3110,3116,3127,3130,3134,3296,3300,3499,3507,3510,3516],[10,11,13],"h1",{"id":12},"terminal-y-bash-de-cero-a-un-script","Terminal y Bash: de cero a un script",[15,16,17],"p",{},"Todo lo que sigue se hace escribiendo, no con el mouse. Si nunca abriste una\nterminal, empieza por aquí: al final vas a poder compilar, moverte por carpetas y\nescribir un script que compile el Rush 00 por tú.",[19,20,22],"h2",{"id":21},"qué-es-una-terminal-y-qué-es-un-shell","Qué es una terminal (y qué es un shell)",[15,24,25],{},"Son dos cosas distintas que se usan juntas:",[27,28,29,45],"table",{},[30,31,32],"thead",{},[33,34,35,39,42],"tr",{},[36,37,38],"th",{},"Pieza",[36,40,41],{},"Qué es",[36,43,44],{},"Ejemplo",[46,47,48,63],"tbody",{},[33,49,50,57,60],{},[51,52,53],"td",{},[54,55,56],"strong",{},"Terminal",[51,58,59],{},"la ventana que muestra texto",[51,61,62],{},"GNOME Terminal, iTerm2, Windows Terminal",[33,64,65,70,77],{},[51,66,67],{},[54,68,69],{},"Shell",[51,71,72,73,76],{},"el programa que ",[54,74,75],{},"interpreta"," lo que escribes",[51,78,79],{},"bash, zsh, fish",[15,81,82],{},"La terminal es el vidrio; el shell es el que trabaja. Cuando ves algo así:",[84,85,90],"pre",{"className":86,"code":88,"language":89},[87],"language-text","laura@maquina:~\u002F42-piscina$\n","text",[91,92,88],"code",{"__ignoreMap":93},"",[15,95,96,97,100,101,104,105,108,109,112,113,116],{},"Eso es el ",[54,98,99],{},"prompt",". Se lee: usuario ",[91,102,103],{},"laura",", máquina ",[91,106,107],{},"maquina",", carpeta\nactual ",[91,110,111],{},"~\u002F42-piscina",", y ",[91,114,115],{},"$"," significa \"esperando una orden\".",[118,119,120],"blockquote",{},[15,121,122,125,126,128,129,131],{},[91,123,124],{},"#"," en lugar de ",[91,127,115],{}," significa que eres root (administrador). Si ves ",[91,130,124],{}," y no\nquerías estar ahí, sal antes de escribir cualquier cosa.",[19,133,135],{"id":134},"cómo-se-lee-un-comando","Cómo se lee un comando",[84,137,141],{"className":138,"code":139,"language":140,"meta":93,"style":93},"language-sh shiki shiki-themes github-light github-dark","ls -la ex00\n","sh",[91,142,143],{"__ignoreMap":93},[144,145,148,152,156],"span",{"class":146,"line":147},"line",1,[144,149,151],{"class":150},"sScJk","ls",[144,153,155],{"class":154},"sj4cs"," -la",[144,157,159],{"class":158},"sZZnC"," ex00\n",[27,161,162,175],{},[30,163,164],{},[33,165,166,169,172],{},[36,167,168],{},"Parte",[36,170,171],{},"Nombre",[36,173,174],{},"Significado",[46,176,177,189,202],{},[33,178,179,183,186],{},[51,180,181],{},[91,182,151],{},[51,184,185],{},"comando",[51,187,188],{},"el programa que se ejecuta",[33,190,191,196,199],{},[51,192,193],{},[91,194,195],{},"-la",[51,197,198],{},"opciones (flags)",[51,200,201],{},"modifican su comportamiento",[33,203,204,209,212],{},[51,205,206],{},[91,207,208],{},"ex00",[51,210,211],{},"argumento",[51,213,214],{},"sobre qué actúa",[15,216,217,218,221,222,224,225,228],{},"Los flags cortos se pueden juntar: ",[91,219,220],{},"-l -a"," es lo mismo que ",[91,223,195],{},". Los flags\nlargos usan dos guiones: ",[91,226,227],{},"--all",".",[15,230,231],{},"Casi todos los comandos traen su manual:",[84,233,235],{"className":138,"code":234,"language":140,"meta":93,"style":93},"man ls          # manual completo (se sale con q)\nls --help       # resumen corto\n",[91,236,237,249],{"__ignoreMap":93},[144,238,239,242,245],{"class":146,"line":147},[144,240,241],{"class":150},"man",[144,243,244],{"class":158}," ls",[144,246,248],{"class":247},"sJ8bj","          # manual completo (se sale con q)\n",[144,250,252,254,257],{"class":146,"line":251},2,[144,253,151],{"class":150},[144,255,256],{"class":154}," --help",[144,258,259],{"class":247},"       # resumen corto\n",[261,262,264],"h3",{"id":263},"atajos-que-te-salvan-la-vida","Atajos que te salvan la vida",[27,266,267,277],{},[30,268,269],{},[33,270,271,274],{},[36,272,273],{},"Atajo",[36,275,276],{},"Qué hace",[46,278,279,289,299,313,323,337,350],{},[33,280,281,286],{},[51,282,283],{},[91,284,285],{},"Tab",[51,287,288],{},"autocompleta nombres de archivos y comandos",[33,290,291,296],{},[51,292,293],{},[91,294,295],{},"Ctrl+C",[51,297,298],{},"cancela el comando que está corriendo",[33,300,301,306],{},[51,302,303],{},[91,304,305],{},"Ctrl+L",[51,307,308,309,312],{},"limpia la pantalla (como ",[91,310,311],{},"clear",")",[33,314,315,320],{},[51,316,317],{},[91,318,319],{},"Ctrl+R",[51,321,322],{},"busca en el historial de comandos",[33,324,325,334],{},[51,326,327,330,331],{},[91,328,329],{},"↑"," \u002F ",[91,332,333],{},"↓",[51,335,336],{},"recorre comandos anteriores",[33,338,339,347],{},[51,340,341,330,344],{},[91,342,343],{},"Ctrl+A",[91,345,346],{},"Ctrl+E",[51,348,349],{},"va al principio \u002F final de la línea",[33,351,352,357],{},[51,353,354],{},[91,355,356],{},"Ctrl+U",[51,358,359],{},"borra desde el cursor hasta el principio",[15,361,362,364],{},[91,363,285],{}," es el atajo más importante: úsalo siempre y deja de escribir rutas a mano.",[19,366,368],{"id":367},"rutas-dónde-estás-parado","Rutas: dónde estás parado",[15,370,371],{},"Hay dos formas de nombrar una ubicación:",[27,373,374,386],{},[30,375,376],{},[33,377,378,381,383],{},[36,379,380],{},"Tipo",[36,382,44],{},[36,384,385],{},"Significa",[46,387,388,403],{},[33,389,390,395,400],{},[51,391,392],{},[54,393,394],{},"absoluta",[51,396,397],{},[91,398,399],{},"\u002Fhome\u002Flaura\u002F42-piscina",[51,401,402],{},"desde la raíz del sistema",[33,404,405,410,418],{},[51,406,407],{},[54,408,409],{},"relativa",[51,411,412,414,415],{},[91,413,208],{}," o ",[91,416,417],{},"..\u002FREADME.md",[51,419,420],{},"desde donde estás ahora",[15,422,423],{},"Símbolos que vas a ver todo el tiempo:",[27,425,426,435],{},[30,427,428],{},[33,429,430,433],{},[36,431,432],{},"Símbolo",[36,434,174],{},[46,436,437,447,460,469,479],{},[33,438,439,444],{},[51,440,441],{},[91,442,443],{},"\u002F",[51,445,446],{},"la raíz del sistema",[33,448,449,454],{},[51,450,451],{},[91,452,453],{},"~",[51,455,456,457,312],{},"tu carpeta personal (",[91,458,459],{},"\u002Fhome\u002Flaura",[33,461,462,466],{},[51,463,464],{},[91,465,228],{},[51,467,468],{},"la carpeta actual",[33,470,471,476],{},[51,472,473],{},[91,474,475],{},"..",[51,477,478],{},"la carpeta de arriba",[33,480,481,486],{},[51,482,483],{},[91,484,485],{},"-",[51,487,488,489,492],{},"la carpeta anterior (",[91,490,491],{},"cd -"," vuelve)",[84,494,496],{"className":138,"code":495,"language":140,"meta":93,"style":93},"pwd             # ¿dónde estoy?\ncd ex00         # entro a ex00\ncd ..           # vuelvo atrás\ncd ~            # voy a mi carpeta personal\ncd -            # vuelvo a la anterior\n",[91,497,498,506,517,528,539],{"__ignoreMap":93},[144,499,500,503],{"class":146,"line":147},[144,501,502],{"class":154},"pwd",[144,504,505],{"class":247},"             # ¿dónde estoy?\n",[144,507,508,511,514],{"class":146,"line":251},[144,509,510],{"class":154},"cd",[144,512,513],{"class":158}," ex00",[144,515,516],{"class":247},"         # entro a ex00\n",[144,518,520,522,525],{"class":146,"line":519},3,[144,521,510],{"class":154},[144,523,524],{"class":158}," ..",[144,526,527],{"class":247},"           # vuelvo atrás\n",[144,529,531,533,536],{"class":146,"line":530},4,[144,532,510],{"class":154},[144,534,535],{"class":158}," ~",[144,537,538],{"class":247},"            # voy a mi carpeta personal\n",[144,540,542,544,547],{"class":146,"line":541},5,[144,543,510],{"class":154},[144,545,546],{"class":158}," -",[144,548,549],{"class":247},"            # vuelvo a la anterior\n",[19,551,553],{"id":552},"ver-archivos-y-moverse","Ver archivos y moverse",[84,555,557],{"className":138,"code":556,"language":140,"meta":93,"style":93},"ls              # lista\nls -l           # lista con detalles\nls -la          # incluye archivos ocultos (los que empiezan con .)\nls -lh          # tamaños legibles (K, M, G)\ntree            # árbol de carpetas (puede no estar instalado)\n",[91,558,559,566,576,585,595],{"__ignoreMap":93},[144,560,561,563],{"class":146,"line":147},[144,562,151],{"class":150},[144,564,565],{"class":247},"              # lista\n",[144,567,568,570,573],{"class":146,"line":251},[144,569,151],{"class":150},[144,571,572],{"class":154}," -l",[144,574,575],{"class":247},"           # lista con detalles\n",[144,577,578,580,582],{"class":146,"line":519},[144,579,151],{"class":150},[144,581,155],{"class":154},[144,583,584],{"class":247},"          # incluye archivos ocultos (los que empiezan con .)\n",[144,586,587,589,592],{"class":146,"line":530},[144,588,151],{"class":150},[144,590,591],{"class":154}," -lh",[144,593,594],{"class":247},"          # tamaños legibles (K, M, G)\n",[144,596,597,600],{"class":146,"line":541},[144,598,599],{"class":150},"tree",[144,601,602],{"class":247},"            # árbol de carpetas (puede no estar instalado)\n",[15,604,605],{},"Ver el contenido sin abrir un editor:",[84,607,609],{"className":138,"code":608,"language":140,"meta":93,"style":93},"cat README.md        # todo de una\nless README.md       # paginado: q para salir, \u002F para buscar\nhead -20 README.md   # primeras 20 líneas\ntail -20 README.md   # últimas 20\ntail -f archivo.log  # sigue el archivo en vivo (Ctrl+C para cortar)\nwc -l README.md      # cuenta líneas\nfile rush00          # qué tipo de archivo es\n",[91,610,611,622,632,645,657,670,683],{"__ignoreMap":93},[144,612,613,616,619],{"class":146,"line":147},[144,614,615],{"class":150},"cat",[144,617,618],{"class":158}," README.md",[144,620,621],{"class":247},"        # todo de una\n",[144,623,624,627,629],{"class":146,"line":251},[144,625,626],{"class":150},"less",[144,628,618],{"class":158},[144,630,631],{"class":247},"       # paginado: q para salir, \u002F para buscar\n",[144,633,634,637,640,642],{"class":146,"line":519},[144,635,636],{"class":150},"head",[144,638,639],{"class":154}," -20",[144,641,618],{"class":158},[144,643,644],{"class":247},"   # primeras 20 líneas\n",[144,646,647,650,652,654],{"class":146,"line":530},[144,648,649],{"class":150},"tail",[144,651,639],{"class":154},[144,653,618],{"class":158},[144,655,656],{"class":247},"   # últimas 20\n",[144,658,659,661,664,667],{"class":146,"line":541},[144,660,649],{"class":150},[144,662,663],{"class":154}," -f",[144,665,666],{"class":158}," archivo.log",[144,668,669],{"class":247},"  # sigue el archivo en vivo (Ctrl+C para cortar)\n",[144,671,673,676,678,680],{"class":146,"line":672},6,[144,674,675],{"class":150},"wc",[144,677,572],{"class":154},[144,679,618],{"class":158},[144,681,682],{"class":247},"      # cuenta líneas\n",[144,684,686,689,692],{"class":146,"line":685},7,[144,687,688],{"class":150},"file",[144,690,691],{"class":158}," rush00",[144,693,694],{"class":247},"          # qué tipo de archivo es\n",[19,696,698],{"id":697},"crear-copiar-mover-y-borrar","Crear, copiar, mover y borrar",[27,700,701,713],{},[30,702,703],{},[33,704,705,708,710],{},[36,706,707],{},"Comando",[36,709,276],{},[36,711,712],{},"Cuidado",[46,714,715,728,740,752,768,781,796],{},[33,716,717,722,725],{},[51,718,719],{},[91,720,721],{},"touch notas.txt",[51,723,724],{},"crea un archivo vacío",[51,726,727],{},"—",[33,729,730,735,738],{},[51,731,732],{},[91,733,734],{},"mkdir ex01",[51,736,737],{},"crea una carpeta",[51,739,727],{},[33,741,742,747,750],{},[51,743,744],{},[91,745,746],{},"mkdir -p a\u002Fb\u002Fc",[51,748,749],{},"crea toda la ruta",[51,751,727],{},[33,753,754,759,762],{},[51,755,756],{},[91,757,758],{},"cp origen destino",[51,760,761],{},"copia",[51,763,764,767],{},[91,765,766],{},"-r"," para carpetas",[33,769,770,775,778],{},[51,771,772],{},[91,773,774],{},"mv origen destino",[51,776,777],{},"mueve o renombra",[51,779,780],{},"pisa sin preguntar",[33,782,783,788,791],{},[51,784,785],{},[91,786,787],{},"rm archivo",[51,789,790],{},"borra",[51,792,793],{},[54,794,795],{},"no hay papelera",[33,797,798,803,806],{},[51,799,800],{},[91,801,802],{},"rm -r carpeta",[51,804,805],{},"borra carpeta y contenido",[51,807,808],{},[54,809,795],{},[118,811,812],{},[15,813,814,820,821,824,825,827,828,831,832,414,835,838],{},[54,815,816,817],{},"La regla del ",[91,818,819],{},"rm",": en la terminal no existe \"deshacer\". Antes de escribir\n",[91,822,823],{},"rm -rf algo",", escribe ",[91,826,502],{}," y ",[91,829,830],{},"ls algo",". Dos segundos de verificación evitan\nperder el día. ",[91,833,834],{},"rm -rf \u002F",[91,836,837],{},"rm -rf ~"," son las dos formas más rápidas de\ndestruir una máquina.",[19,840,842],{"id":841},"buscar","Buscar",[84,844,846],{"className":138,"code":845,"language":140,"meta":93,"style":93},"find . -name \"*.c\"              # archivos .c desde aquí hacia abajo\nfind . -type d -name \"ex*\"      # solo carpetas\ngrep -rn \"rush\" ex00\u002F           # busca el texto en todos los archivos\ngrep -n \"int\" ex00\u002Fmain.c       # número de línea de cada coincidencia\n",[91,847,848,865,885,902],{"__ignoreMap":93},[144,849,850,853,856,859,862],{"class":146,"line":147},[144,851,852],{"class":150},"find",[144,854,855],{"class":158}," .",[144,857,858],{"class":154}," -name",[144,860,861],{"class":158}," \"*.c\"",[144,863,864],{"class":247},"              # archivos .c desde aquí hacia abajo\n",[144,866,867,869,871,874,877,879,882],{"class":146,"line":251},[144,868,852],{"class":150},[144,870,855],{"class":158},[144,872,873],{"class":154}," -type",[144,875,876],{"class":158}," d",[144,878,858],{"class":154},[144,880,881],{"class":158}," \"ex*\"",[144,883,884],{"class":247},"      # solo carpetas\n",[144,886,887,890,893,896,899],{"class":146,"line":519},[144,888,889],{"class":150},"grep",[144,891,892],{"class":154}," -rn",[144,894,895],{"class":158}," \"rush\"",[144,897,898],{"class":158}," ex00\u002F",[144,900,901],{"class":247},"           # busca el texto en todos los archivos\n",[144,903,904,906,909,912,915],{"class":146,"line":530},[144,905,889],{"class":150},[144,907,908],{"class":154}," -n",[144,910,911],{"class":158}," \"int\"",[144,913,914],{"class":158}," ex00\u002Fmain.c",[144,916,917],{"class":247},"       # número de línea de cada coincidencia\n",[15,919,920,922,923,925,926,929,930,933],{},[91,921,889],{}," es el que más vas a usar. ",[91,924,766],{}," recorre carpetas, ",[91,927,928],{},"-n"," muestra líneas,\n",[91,931,932],{},"-i"," ignora mayúsculas.",[19,935,937],{"id":936},"permisos-por-qué-un-script-no-se-ejecuta","Permisos: por qué un script \"no se ejecuta\"",[84,939,941],{"className":138,"code":940,"language":140,"meta":93,"style":93},"ls -l rush00\n-rwxr-xr-x  1 laura laura  16352 nov  1 13:00 rush00\n",[91,942,943,952],{"__ignoreMap":93},[144,944,945,947,949],{"class":146,"line":147},[144,946,151],{"class":150},[144,948,572],{"class":154},[144,950,951],{"class":158}," rush00\n",[144,953,954,957,960,963,965,968,971,973,976],{"class":146,"line":251},[144,955,956],{"class":150},"-rwxr-xr-x",[144,958,959],{"class":154},"  1",[144,961,962],{"class":158}," laura",[144,964,962],{"class":158},[144,966,967],{"class":154},"  16352",[144,969,970],{"class":158}," nov",[144,972,959],{"class":154},[144,974,975],{"class":158}," 13:00",[144,977,951],{"class":158},[15,979,980,981,983],{},"Ese ",[91,982,956],{}," se lee en cuatro bloques:",[84,985,988],{"className":986,"code":987,"language":89},[87],"-   rwx   r-x   r-x\n│    │     │     │\n│    │     │     └── otros: leer y ejecutar\n│    │     └──────── grupo: leer y ejecutar\n│    └────────────── dueño: leer, escribir y ejecutar\n└─────────────────── tipo: - archivo, d carpeta, l enlace\n",[91,989,987],{"__ignoreMap":93},[27,991,992,1008],{},[30,993,994],{},[33,995,996,999,1002,1005],{},[36,997,998],{},"Letra",[36,1000,1001],{},"Permiso",[36,1003,1004],{},"En un archivo",[36,1006,1007],{},"En una carpeta",[46,1009,1010,1026,1042],{},[33,1011,1012,1017,1020,1023],{},[51,1013,1014],{},[91,1015,1016],{},"r",[51,1018,1019],{},"read",[51,1021,1022],{},"leerlo",[51,1024,1025],{},"listar su contenido",[33,1027,1028,1033,1036,1039],{},[51,1029,1030],{},[91,1031,1032],{},"w",[51,1034,1035],{},"write",[51,1037,1038],{},"modificarlo",[51,1040,1041],{},"crear\u002Fborrar dentro",[33,1043,1044,1049,1052,1055],{},[51,1045,1046],{},[91,1047,1048],{},"x",[51,1050,1051],{},"execute",[51,1053,1054],{},"ejecutarlo",[51,1056,1057,1058,312],{},"entrar (",[91,1059,510],{},[15,1061,1062],{},"Cambiar permisos:",[84,1064,1066],{"className":138,"code":1065,"language":140,"meta":93,"style":93},"chmod +x script.sh      # agrega ejecución para todos\nchmod 644 archivo.txt   # rw-r--r--  (archivo normal)\nchmod 755 script.sh     # rwxr-xr-x  (script ejecutable)\nchmod 600 clave.txt     # rw-------  (solo el dueño)\n",[91,1067,1068,1082,1095,1107],{"__ignoreMap":93},[144,1069,1070,1073,1076,1079],{"class":146,"line":147},[144,1071,1072],{"class":150},"chmod",[144,1074,1075],{"class":158}," +x",[144,1077,1078],{"class":158}," script.sh",[144,1080,1081],{"class":247},"      # agrega ejecución para todos\n",[144,1083,1084,1086,1089,1092],{"class":146,"line":251},[144,1085,1072],{"class":150},[144,1087,1088],{"class":154}," 644",[144,1090,1091],{"class":158}," archivo.txt",[144,1093,1094],{"class":247},"   # rw-r--r--  (archivo normal)\n",[144,1096,1097,1099,1102,1104],{"class":146,"line":519},[144,1098,1072],{"class":150},[144,1100,1101],{"class":154}," 755",[144,1103,1078],{"class":158},[144,1105,1106],{"class":247},"     # rwxr-xr-x  (script ejecutable)\n",[144,1108,1109,1111,1114,1117],{"class":146,"line":530},[144,1110,1072],{"class":150},[144,1112,1113],{"class":154}," 600",[144,1115,1116],{"class":158}," clave.txt",[144,1118,1119],{"class":247},"     # rw-------  (solo el dueño)\n",[15,1121,1122,1123,1126,1127,1126,1130,1133,1134,1137,1138,1141,1142,1145,1146,1148],{},"Los números son la suma de ",[91,1124,1125],{},"r=4",", ",[91,1128,1129],{},"w=2",[91,1131,1132],{},"x=1"," por cada bloque (dueño, grupo,\notros). ",[91,1135,1136],{},"755"," = ",[91,1139,1140],{},"7"," (4+2+1) + ",[91,1143,1144],{},"5"," (4+1) + ",[91,1147,1144],{}," (4+1).",[118,1150,1151],{},[15,1152,1153,1154,1157,1158,1161,1162,1165],{},"Si ",[91,1155,1156],{},".\u002Fscript.sh"," dice ",[91,1159,1160],{},"Permission denied",", casi siempre es que falta\n",[91,1163,1164],{},"chmod +x",". No es que el script esté mal escrito.",[19,1167,1169],{"id":1168},"redirecciones-y-pipes-el-superpoder","Redirecciones y pipes: el superpoder",[15,1171,1172],{},"Todo programa tiene tres canales:",[27,1174,1175,1188],{},[30,1176,1177],{},[33,1178,1179,1182,1185],{},[36,1180,1181],{},"Canal",[36,1183,1184],{},"Número",[36,1186,1187],{},"Para qué",[46,1189,1190,1207,1223],{},[33,1191,1192,1195,1204],{},[51,1193,1194],{},"entrada",[51,1196,1197,1200,1201,312],{},[91,1198,1199],{},"0"," (",[91,1202,1203],{},"stdin",[51,1205,1206],{},"de dónde lee",[33,1208,1209,1212,1220],{},[51,1210,1211],{},"salida",[51,1213,1214,1200,1217,312],{},[91,1215,1216],{},"1",[91,1218,1219],{},"stdout",[51,1221,1222],{},"a dónde escribe el resultado",[33,1224,1225,1228,1236],{},[51,1226,1227],{},"errores",[51,1229,1230,1200,1233,312],{},[91,1231,1232],{},"2",[91,1234,1235],{},"stderr",[51,1237,1238],{},"a dónde escribe los errores",[15,1240,1241],{},"Se pueden redirigir:",[84,1243,1245],{"className":138,"code":1244,"language":140,"meta":93,"style":93},"ls > lista.txt          # guarda la salida (pisa el archivo)\nls >> lista.txt         # agrega al final\nwc -l \u003C lista.txt       # lee la entrada desde un archivo\ngcc main.c 2> errores.txt   # guarda solo los errores\ngcc main.c > todo.txt 2>&1  # guarda salida y errores juntos\nls no-existe 2> \u002Fdev\u002Fnull   # tira los errores a la basura\n",[91,1246,1247,1261,1273,1287,1304,1321],{"__ignoreMap":93},[144,1248,1249,1251,1255,1258],{"class":146,"line":147},[144,1250,151],{"class":150},[144,1252,1254],{"class":1253},"szBVR"," >",[144,1256,1257],{"class":158}," lista.txt",[144,1259,1260],{"class":247},"          # guarda la salida (pisa el archivo)\n",[144,1262,1263,1265,1268,1270],{"class":146,"line":251},[144,1264,151],{"class":150},[144,1266,1267],{"class":1253}," >>",[144,1269,1257],{"class":158},[144,1271,1272],{"class":247},"         # agrega al final\n",[144,1274,1275,1277,1279,1282,1284],{"class":146,"line":519},[144,1276,675],{"class":150},[144,1278,572],{"class":154},[144,1280,1281],{"class":1253}," \u003C",[144,1283,1257],{"class":158},[144,1285,1286],{"class":247},"       # lee la entrada desde un archivo\n",[144,1288,1289,1292,1295,1298,1301],{"class":146,"line":530},[144,1290,1291],{"class":150},"gcc",[144,1293,1294],{"class":158}," main.c",[144,1296,1297],{"class":1253}," 2>",[144,1299,1300],{"class":158}," errores.txt",[144,1302,1303],{"class":247},"   # guarda solo los errores\n",[144,1305,1306,1308,1310,1312,1315,1318],{"class":146,"line":541},[144,1307,1291],{"class":150},[144,1309,1294],{"class":158},[144,1311,1254],{"class":1253},[144,1313,1314],{"class":158}," todo.txt",[144,1316,1317],{"class":1253}," 2>&1",[144,1319,1320],{"class":247},"  # guarda salida y errores juntos\n",[144,1322,1323,1325,1328,1330,1333],{"class":146,"line":672},[144,1324,151],{"class":150},[144,1326,1327],{"class":158}," no-existe",[144,1329,1297],{"class":1253},[144,1331,1332],{"class":158}," \u002Fdev\u002Fnull",[144,1334,1335],{"class":247},"   # tira los errores a la basura\n",[15,1337,1338,1339,1342,1343,1346],{},"Y se pueden ",[54,1340,1341],{},"conectar"," programas con ",[91,1344,1345],{},"|"," (pipe): la salida de uno entra como\nentrada del siguiente.",[84,1348,1350],{"className":138,"code":1349,"language":140,"meta":93,"style":93},"ls -l | grep \".c\"           # solo las líneas que contienen .c\ncat README.md | wc -l       # cuenta líneas del README\nhistory | grep gcc          # busca en tu historial\nls -l | sort -k5 -n | tail  # los 5 archivos más pesados\n",[91,1351,1352,1370,1386,1401],{"__ignoreMap":93},[144,1353,1354,1356,1358,1361,1364,1367],{"class":146,"line":147},[144,1355,151],{"class":150},[144,1357,572],{"class":154},[144,1359,1360],{"class":1253}," |",[144,1362,1363],{"class":150}," grep",[144,1365,1366],{"class":158}," \".c\"",[144,1368,1369],{"class":247},"           # solo las líneas que contienen .c\n",[144,1371,1372,1374,1376,1378,1381,1383],{"class":146,"line":251},[144,1373,615],{"class":150},[144,1375,618],{"class":158},[144,1377,1360],{"class":1253},[144,1379,1380],{"class":150}," wc",[144,1382,572],{"class":154},[144,1384,1385],{"class":247},"       # cuenta líneas del README\n",[144,1387,1388,1391,1393,1395,1398],{"class":146,"line":519},[144,1389,1390],{"class":154},"history",[144,1392,1360],{"class":1253},[144,1394,1363],{"class":150},[144,1396,1397],{"class":158}," gcc",[144,1399,1400],{"class":247},"          # busca en tu historial\n",[144,1402,1403,1405,1407,1409,1412,1415,1417,1419,1422],{"class":146,"line":530},[144,1404,151],{"class":150},[144,1406,572],{"class":154},[144,1408,1360],{"class":1253},[144,1410,1411],{"class":150}," sort",[144,1413,1414],{"class":154}," -k5",[144,1416,908],{"class":154},[144,1418,1360],{"class":1253},[144,1420,1421],{"class":150}," tail",[144,1423,1424],{"class":247},"  # los 5 archivos más pesados\n",[15,1426,1427,1430,1431,1434],{},[91,1428,1429],{},"tee"," escribe en pantalla ",[54,1432,1433],{},"y"," en un archivo:",[84,1436,1438],{"className":138,"code":1437,"language":140,"meta":93,"style":93},"gcc main.c 2>&1 | tee compilacion.log\n",[91,1439,1440],{"__ignoreMap":93},[144,1441,1442,1444,1446,1448,1450,1453],{"class":146,"line":147},[144,1443,1291],{"class":150},[144,1445,1294],{"class":158},[144,1447,1317],{"class":1253},[144,1449,1360],{"class":1253},[144,1451,1452],{"class":150}," tee",[144,1454,1455],{"class":158}," compilacion.log\n",[19,1457,1459],{"id":1458},"procesos","Procesos",[84,1461,1463],{"className":138,"code":1462,"language":140,"meta":93,"style":93},"ps aux              # todos los procesos\ntop                 # monitor en vivo (q para salir)\nhtop                # versión linda, si está instalada\nkill 1234           # pide terminar el proceso 1234 (amable)\nkill -9 1234        # lo mata sí o sí (último recurso)\n",[91,1464,1465,1476,1484,1492,1503],{"__ignoreMap":93},[144,1466,1467,1470,1473],{"class":146,"line":147},[144,1468,1469],{"class":150},"ps",[144,1471,1472],{"class":158}," aux",[144,1474,1475],{"class":247},"              # todos los procesos\n",[144,1477,1478,1481],{"class":146,"line":251},[144,1479,1480],{"class":150},"top",[144,1482,1483],{"class":247},"                 # monitor en vivo (q para salir)\n",[144,1485,1486,1489],{"class":146,"line":519},[144,1487,1488],{"class":150},"htop",[144,1490,1491],{"class":247},"                # versión linda, si está instalada\n",[144,1493,1494,1497,1500],{"class":146,"line":530},[144,1495,1496],{"class":154},"kill",[144,1498,1499],{"class":154}," 1234",[144,1501,1502],{"class":247},"           # pide terminar el proceso 1234 (amable)\n",[144,1504,1505,1507,1510,1512],{"class":146,"line":541},[144,1506,1496],{"class":154},[144,1508,1509],{"class":154}," -9",[144,1511,1499],{"class":154},[144,1513,1514],{"class":247},"        # lo mata sí o sí (último recurso)\n",[15,1516,1517],{},"Desde la terminal:",[27,1519,1520,1528],{},[30,1521,1522],{},[33,1523,1524,1526],{},[36,1525,273],{},[36,1527,276],{},[46,1529,1530,1539,1549,1559,1569,1579],{},[33,1531,1532,1536],{},[51,1533,1534],{},[91,1535,295],{},[51,1537,1538],{},"termina el proceso en primer plano",[33,1540,1541,1546],{},[51,1542,1543],{},[91,1544,1545],{},"Ctrl+Z",[51,1547,1548],{},"lo suspende y te devuelve el prompt",[33,1550,1551,1556],{},[51,1552,1553],{},[91,1554,1555],{},"comando &",[51,1557,1558],{},"lo lanza en segundo plano",[33,1560,1561,1566],{},[51,1562,1563],{},[91,1564,1565],{},"jobs",[51,1567,1568],{},"lista los trabajos suspendidos",[33,1570,1571,1576],{},[51,1572,1573],{},[91,1574,1575],{},"fg",[51,1577,1578],{},"trae el último al frente",[33,1580,1581,1586],{},[51,1582,1583],{},[91,1584,1585],{},"bg",[51,1587,1588],{},"lo sigue en segundo plano",[118,1590,1591],{},[15,1592,1593,1594,1596,1597,228],{},"Si un programa \"no termina\", ",[91,1595,295],{}," es lo primero que hay que probar. Si no\nresponde, abre otra terminal y busca el proceso con ",[91,1598,1599],{},"ps aux",[19,1601,1603],{"id":1602},"variables-de-entorno","Variables de entorno",[15,1605,1606],{},"Una variable es una caja con nombre. En el shell se usa así:",[84,1608,1610],{"className":138,"code":1609,"language":140,"meta":93,"style":93},"NOMBRE=\"laura\"         # asignar (sin espacios alrededor del =)\necho \"$NOMBRE\"          # leer\nexport NOMBRE           # hacerla visible a los programas que lances\n",[91,1611,1612,1627,1644],{"__ignoreMap":93},[144,1613,1614,1618,1621,1624],{"class":146,"line":147},[144,1615,1617],{"class":1616},"sVt8B","NOMBRE",[144,1619,1620],{"class":1253},"=",[144,1622,1623],{"class":158},"\"laura\"",[144,1625,1626],{"class":247},"         # asignar (sin espacios alrededor del =)\n",[144,1628,1629,1632,1635,1638,1641],{"class":146,"line":251},[144,1630,1631],{"class":154},"echo",[144,1633,1634],{"class":158}," \"",[144,1636,1637],{"class":1616},"$NOMBRE",[144,1639,1640],{"class":158},"\"",[144,1642,1643],{"class":247},"          # leer\n",[144,1645,1646,1649,1652],{"class":146,"line":519},[144,1647,1648],{"class":1253},"export",[144,1650,1651],{"class":1616}," NOMBRE           ",[144,1653,1654],{"class":247},"# hacerla visible a los programas que lances\n",[15,1656,1657,1658,1660],{},"Ese detalle del ",[91,1659,1620],{}," es el error número uno:",[84,1662,1664],{"className":138,"code":1663,"language":140,"meta":93,"style":93},"NOMBRE = \"laura\"   # MAL: intenta ejecutar el comando \"NOMBRE\"\nNOMBRE=\"laura\"     # BIEN\n",[91,1665,1666,1679],{"__ignoreMap":93},[144,1667,1668,1670,1673,1676],{"class":146,"line":147},[144,1669,1617],{"class":150},[144,1671,1672],{"class":158}," =",[144,1674,1675],{"class":158}," \"laura\"",[144,1677,1678],{"class":247},"   # MAL: intenta ejecutar el comando \"NOMBRE\"\n",[144,1680,1681,1683,1685,1687],{"class":146,"line":251},[144,1682,1617],{"class":1616},[144,1684,1620],{"class":1253},[144,1686,1623],{"class":158},[144,1688,1689],{"class":247},"     # BIEN\n",[15,1691,1692,1693,1696],{},"La variable más importante es ",[91,1694,1695],{},"PATH",": la lista de carpetas donde el shell busca\nlos comandos.",[84,1698,1700],{"className":138,"code":1699,"language":140,"meta":93,"style":93},"echo \"$PATH\"            # carpetas separadas por :\nwhich gcc               # ¿de dónde sale gcc?\nexport PATH=\"$PATH:$HOME\u002Fbin\"   # agrega tu carpeta de scripts\n",[91,1701,1702,1716,1726],{"__ignoreMap":93},[144,1703,1704,1706,1708,1711,1713],{"class":146,"line":147},[144,1705,1631],{"class":154},[144,1707,1634],{"class":158},[144,1709,1710],{"class":1616},"$PATH",[144,1712,1640],{"class":158},[144,1714,1715],{"class":247},"            # carpetas separadas por :\n",[144,1717,1718,1721,1723],{"class":146,"line":251},[144,1719,1720],{"class":154},"which",[144,1722,1397],{"class":158},[144,1724,1725],{"class":247},"               # ¿de dónde sale gcc?\n",[144,1727,1728,1730,1733,1735,1737,1739,1742,1745,1748],{"class":146,"line":519},[144,1729,1648],{"class":1253},[144,1731,1732],{"class":1616}," PATH",[144,1734,1620],{"class":1253},[144,1736,1640],{"class":158},[144,1738,1710],{"class":1616},[144,1740,1741],{"class":158},":",[144,1743,1744],{"class":1616},"$HOME",[144,1746,1747],{"class":158},"\u002Fbin\"",[144,1749,1750],{"class":247},"   # agrega tu carpeta de scripts\n",[15,1752,1753],{},"Las comillas también importan:",[84,1755,1757],{"className":138,"code":1756,"language":140,"meta":93,"style":93},"echo $NOMBRE        # si está vacío, no imprime nada\necho \"$NOMBRE\"      # siempre una sola palabra, aunque tenga espacios\n",[91,1758,1759,1769],{"__ignoreMap":93},[144,1760,1761,1763,1766],{"class":146,"line":147},[144,1762,1631],{"class":154},[144,1764,1765],{"class":1616}," $NOMBRE        ",[144,1767,1768],{"class":247},"# si está vacío, no imprime nada\n",[144,1770,1771,1773,1775,1777,1779],{"class":146,"line":251},[144,1772,1631],{"class":154},[144,1774,1634],{"class":158},[144,1776,1637],{"class":1616},[144,1778,1640],{"class":158},[144,1780,1781],{"class":247},"      # siempre una sola palabra, aunque tenga espacios\n",[15,1783,1784,1785,1200,1788,1791],{},"Regla práctica: ",[54,1786,1787],{},"comilla siempre las variables",[91,1789,1790],{},"\"$VAR\"","). Evita el 90 % de\nlos bugs de scripting.",[261,1793,1795],{"id":1794},"dónde-guardar-la-configuración","Dónde guardar la configuración",[27,1797,1798,1808],{},[30,1799,1800],{},[33,1801,1802,1805],{},[36,1803,1804],{},"Archivo",[36,1806,1807],{},"Cuándo se carga",[46,1809,1810,1820,1830,1840],{},[33,1811,1812,1817],{},[51,1813,1814],{},[91,1815,1816],{},"~\u002F.bashrc",[51,1818,1819],{},"cada terminal interactiva de bash",[33,1821,1822,1827],{},[51,1823,1824],{},[91,1825,1826],{},"~\u002F.bash_profile",[51,1828,1829],{},"al iniciar sesión (bash)",[33,1831,1832,1837],{},[51,1833,1834],{},[91,1835,1836],{},"~\u002F.zshrc",[51,1838,1839],{},"cada terminal interactiva de zsh",[33,1841,1842,1847],{},[51,1843,1844],{},[91,1845,1846],{},"~\u002F.config\u002Ffish\u002Fconfig.fish",[51,1848,1849],{},"cada terminal de fish",[15,1851,1852,1853,1855,1856,1859],{},"Ahí van los ",[91,1854,1648],{},", los ",[91,1857,1858],{},"alias"," y el prompt:",[84,1861,1863],{"className":138,"code":1862,"language":140,"meta":93,"style":93},"alias ll=\"ls -la\"\nalias g=\"git\"\n",[91,1864,1865,1877],{"__ignoreMap":93},[144,1866,1867,1869,1872,1874],{"class":146,"line":147},[144,1868,1858],{"class":1253},[144,1870,1871],{"class":1616}," ll",[144,1873,1620],{"class":1253},[144,1875,1876],{"class":158},"\"ls -la\"\n",[144,1878,1879,1881,1884,1886],{"class":146,"line":251},[144,1880,1858],{"class":1253},[144,1882,1883],{"class":1616}," g",[144,1885,1620],{"class":1253},[144,1887,1888],{"class":158},"\"git\"\n",[15,1890,1891],{},"Después de editar el archivo, recargalo:",[84,1893,1895],{"className":138,"code":1894,"language":140,"meta":93,"style":93},"source ~\u002F.bashrc    # o ~\u002F.zshrc\n",[91,1896,1897],{"__ignoreMap":93},[144,1898,1899,1902,1905],{"class":146,"line":147},[144,1900,1901],{"class":154},"source",[144,1903,1904],{"class":158}," ~\u002F.bashrc",[144,1906,1907],{"class":247},"    # o ~\u002F.zshrc\n",[19,1909,1911],{"id":1910},"scripts-en-bash","Scripts en Bash",[15,1913,1914,1915,1918],{},"Un script es un archivo de texto con comandos. La primera línea (el\n",[54,1916,1917],{},"shebang",") dice con qué programa ejecutarlo:",[84,1920,1924],{"className":1921,"code":1922,"language":1923,"meta":93,"style":93},"language-bash shiki shiki-themes github-light github-dark","#!\u002Fusr\u002Fbin\u002Fenv bash\n","bash",[91,1925,1926],{"__ignoreMap":93},[144,1927,1928],{"class":146,"line":147},[144,1929,1922],{"class":247},[15,1931,1932,1935,1936,1938,1939,1941,1942,1945],{},[91,1933,1934],{},"\u002Fusr\u002Fbin\u002Fenv bash"," busca ",[91,1937,1923],{}," en el ",[91,1940,1695],{},": es más portable que\n",[91,1943,1944],{},"#!\u002Fbin\u002Fbash",", que asume que bash está en esa ruta exacta.",[15,1947,1948],{},"Para ejecutarlo:",[84,1950,1952],{"className":138,"code":1951,"language":140,"meta":93,"style":93},"chmod +x script.sh   # una sola vez\n.\u002Fscript.sh          # ejecutar\n",[91,1953,1954,1965],{"__ignoreMap":93},[144,1955,1956,1958,1960,1962],{"class":146,"line":147},[144,1957,1072],{"class":150},[144,1959,1075],{"class":158},[144,1961,1078],{"class":158},[144,1963,1964],{"class":247},"   # una sola vez\n",[144,1966,1967,1969],{"class":146,"line":251},[144,1968,1156],{"class":150},[144,1970,1971],{"class":247},"          # ejecutar\n",[15,1973,1974],{},"También se puede ejecutar sin permiso de ejecución:",[84,1976,1978],{"className":138,"code":1977,"language":140,"meta":93,"style":93},"bash script.sh       # no usa el shebang; lo corre con bash\n",[91,1979,1980],{"__ignoreMap":93},[144,1981,1982,1984,1986],{"class":146,"line":147},[144,1983,1923],{"class":150},[144,1985,1078],{"class":158},[144,1987,1988],{"class":247},"       # no usa el shebang; lo corre con bash\n",[261,1990,1992],{"id":1991},"el-encabezado-que-evita-desastres","El encabezado que evita desastres",[84,1994,1996],{"className":1921,"code":1995,"language":1923,"meta":93,"style":93},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\n",[91,1997,1998,2002],{"__ignoreMap":93},[144,1999,2000],{"class":146,"line":147},[144,2001,1922],{"class":247},[144,2003,2004,2007,2010],{"class":146,"line":251},[144,2005,2006],{"class":154},"set",[144,2008,2009],{"class":154}," -euo",[144,2011,2012],{"class":158}," pipefail\n",[27,2014,2015,2024],{},[30,2016,2017],{},[33,2018,2019,2022],{},[36,2020,2021],{},"Flag",[36,2023,276],{},[46,2025,2026,2036,2046],{},[33,2027,2028,2033],{},[51,2029,2030],{},[91,2031,2032],{},"-e",[51,2034,2035],{},"corta el script si un comando falla",[33,2037,2038,2043],{},[51,2039,2040],{},[91,2041,2042],{},"-u",[51,2044,2045],{},"error si usas una variable no definida",[33,2047,2048,2053],{},[51,2049,2050],{},[91,2051,2052],{},"-o pipefail",[51,2054,2055],{},"un pipe falla si falla cualquiera de sus partes",[15,2057,2058],{},"Sin esto, un script sigue adelante después de un error y termina \"bien\" con\nresultados basura. Con esto, falla temprano y fuerte.",[261,2060,2062],{"id":2061},"argumentos","Argumentos",[27,2064,2065,2074],{},[30,2066,2067],{},[33,2068,2069,2072],{},[36,2070,2071],{},"Variable",[36,2073,174],{},[46,2075,2076,2086,2100,2110,2120],{},[33,2077,2078,2083],{},[51,2079,2080],{},[91,2081,2082],{},"$0",[51,2084,2085],{},"nombre del script",[33,2087,2088,2097],{},[51,2089,2090,1126,2093,2096],{},[91,2091,2092],{},"$1",[91,2094,2095],{},"$2","…",[51,2098,2099],{},"argumentos posicionales",[33,2101,2102,2107],{},[51,2103,2104],{},[91,2105,2106],{},"$#",[51,2108,2109],{},"cantidad de argumentos",[33,2111,2112,2117],{},[51,2113,2114],{},[91,2115,2116],{},"$@",[51,2118,2119],{},"todos los argumentos",[33,2121,2122,2127],{},[51,2123,2124],{},[91,2125,2126],{},"$?",[51,2128,2129],{},"código de salida del último comando (0 = bien)",[84,2131,2133],{"className":1921,"code":2132,"language":1923,"meta":93,"style":93},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\n\nif [[ $# -ne 2 ]]; then\n    echo \"Uso: $0 ANCHO ALTO\" >&2\n    exit 1\nfi\n\necho \"Rectángulo de $1 x $2\"\n",[91,2134,2135,2139,2147,2153,2175,2191,2199,2204,2209],{"__ignoreMap":93},[144,2136,2137],{"class":146,"line":147},[144,2138,1922],{"class":247},[144,2140,2141,2143,2145],{"class":146,"line":251},[144,2142,2006],{"class":154},[144,2144,2009],{"class":154},[144,2146,2012],{"class":158},[144,2148,2149],{"class":146,"line":519},[144,2150,2152],{"emptyLinePlaceholder":2151},true,"\n",[144,2154,2155,2158,2161,2163,2166,2169,2172],{"class":146,"line":530},[144,2156,2157],{"class":1253},"if",[144,2159,2160],{"class":1616}," [[ ",[144,2162,2106],{"class":154},[144,2164,2165],{"class":1253}," -ne",[144,2167,2168],{"class":154}," 2",[144,2170,2171],{"class":1616}," ]]; ",[144,2173,2174],{"class":1253},"then\n",[144,2176,2177,2180,2183,2185,2188],{"class":146,"line":541},[144,2178,2179],{"class":154},"    echo",[144,2181,2182],{"class":158}," \"Uso: ",[144,2184,2082],{"class":154},[144,2186,2187],{"class":158}," ANCHO ALTO\"",[144,2189,2190],{"class":1253}," >&2\n",[144,2192,2193,2196],{"class":146,"line":672},[144,2194,2195],{"class":154},"    exit",[144,2197,2198],{"class":154}," 1\n",[144,2200,2201],{"class":146,"line":685},[144,2202,2203],{"class":1253},"fi\n",[144,2205,2207],{"class":146,"line":2206},8,[144,2208,2152],{"emptyLinePlaceholder":2151},[144,2210,2212,2214,2217,2219,2222,2224],{"class":146,"line":2211},9,[144,2213,1631],{"class":154},[144,2215,2216],{"class":158}," \"Rectángulo de ",[144,2218,2092],{"class":154},[144,2220,2221],{"class":158}," x ",[144,2223,2095],{"class":154},[144,2225,2226],{"class":158},"\"\n",[15,2228,2229,2232],{},[91,2230,2231],{},">&2"," manda el mensaje al canal de errores: así el aviso no se mezcla con la\nsalida normal del programa.",[261,2234,2236],{"id":2235},"condicionales","Condicionales",[84,2238,2240],{"className":1921,"code":2239,"language":1923,"meta":93,"style":93},"if [[ -f \"ex00\u002Fmain.c\" ]]; then\n    echo \"existe\"\nelif [[ -d \"ex00\" ]]; then\n    echo \"existe la carpeta pero no el archivo\"\nelse\n    echo \"no existe\"\nfi\n",[91,2241,2242,2258,2265,2282,2289,2294,2301],{"__ignoreMap":93},[144,2243,2244,2246,2248,2251,2254,2256],{"class":146,"line":147},[144,2245,2157],{"class":1253},[144,2247,2160],{"class":1616},[144,2249,2250],{"class":1253},"-f",[144,2252,2253],{"class":158}," \"ex00\u002Fmain.c\"",[144,2255,2171],{"class":1616},[144,2257,2174],{"class":1253},[144,2259,2260,2262],{"class":146,"line":251},[144,2261,2179],{"class":154},[144,2263,2264],{"class":158}," \"existe\"\n",[144,2266,2267,2270,2272,2275,2278,2280],{"class":146,"line":519},[144,2268,2269],{"class":1253},"elif",[144,2271,2160],{"class":1616},[144,2273,2274],{"class":1253},"-d",[144,2276,2277],{"class":158}," \"ex00\"",[144,2279,2171],{"class":1616},[144,2281,2174],{"class":1253},[144,2283,2284,2286],{"class":146,"line":530},[144,2285,2179],{"class":154},[144,2287,2288],{"class":158}," \"existe la carpeta pero no el archivo\"\n",[144,2290,2291],{"class":146,"line":541},[144,2292,2293],{"class":1253},"else\n",[144,2295,2296,2298],{"class":146,"line":672},[144,2297,2179],{"class":154},[144,2299,2300],{"class":158}," \"no existe\"\n",[144,2302,2303],{"class":146,"line":685},[144,2304,2203],{"class":1253},[27,2306,2307,2317],{},[30,2308,2309],{},[33,2310,2311,2314],{},[36,2312,2313],{},"Prueba",[36,2315,2316],{},"Verdadera si…",[46,2318,2319,2329,2339,2349,2359,2369,2379,2389],{},[33,2320,2321,2326],{},[51,2322,2323],{},[91,2324,2325],{},"[[ -f ruta ]]",[51,2327,2328],{},"es un archivo",[33,2330,2331,2336],{},[51,2332,2333],{},[91,2334,2335],{},"[[ -d ruta ]]",[51,2337,2338],{},"es una carpeta",[33,2340,2341,2346],{},[51,2342,2343],{},[91,2344,2345],{},"[[ -x ruta ]]",[51,2347,2348],{},"es ejecutable",[33,2350,2351,2356],{},[51,2352,2353],{},[91,2354,2355],{},"[[ -z \"$var\" ]]",[51,2357,2358],{},"la cadena está vacía",[33,2360,2361,2366],{},[51,2362,2363],{},[91,2364,2365],{},"[[ -n \"$var\" ]]",[51,2367,2368],{},"la cadena no está vacía",[33,2370,2371,2376],{},[51,2372,2373],{},[91,2374,2375],{},"[[ \"$a\" == \"$b\" ]]",[51,2377,2378],{},"son iguales",[33,2380,2381,2386],{},[51,2382,2383],{},[91,2384,2385],{},"[[ \"$a\" != \"$b\" ]]",[51,2387,2388],{},"son distintas",[33,2390,2391,2396],{},[51,2392,2393],{},[91,2394,2395],{},"[[ $n -eq 3 ]]",[51,2397,2398,2399,1126,2402,1126,2405,1126,2408,1126,2411,312],{},"números iguales (",[91,2400,2401],{},"-ne",[91,2403,2404],{},"-lt",[91,2406,2407],{},"-gt",[91,2409,2410],{},"-le",[91,2412,2413],{},"-ge",[15,2415,2416,2417,2420,2421,2424,2425,228],{},"Dos corchetes ",[91,2418,2419],{},"[[ ]]"," son la versión moderna de ",[91,2422,2423],{},"[ ]",": manejan mejor los\nespacios y las comillas. En scripts de bash, usa ",[91,2426,2419],{},[15,2428,2429,2430,2433,2434,2437],{},"También existen los atajos ",[91,2431,2432],{},"&&"," (si salió bien) y ",[91,2435,2436],{},"||"," (si falló):",[84,2439,2441],{"className":138,"code":2440,"language":140,"meta":93,"style":93},"gcc main.c -o prog && .\u002Fprog        # compila y, solo si compiló, ejecuta\ngcc main.c -o prog || echo \"falló\"  # avisa si falló\n",[91,2442,2443,2464],{"__ignoreMap":93},[144,2444,2445,2447,2449,2452,2455,2458,2461],{"class":146,"line":147},[144,2446,1291],{"class":150},[144,2448,1294],{"class":158},[144,2450,2451],{"class":154}," -o",[144,2453,2454],{"class":158}," prog",[144,2456,2457],{"class":1616}," && ",[144,2459,2460],{"class":150},".\u002Fprog",[144,2462,2463],{"class":247},"        # compila y, solo si compiló, ejecuta\n",[144,2465,2466,2468,2470,2472,2474,2477,2480,2483],{"class":146,"line":251},[144,2467,1291],{"class":150},[144,2469,1294],{"class":158},[144,2471,2451],{"class":154},[144,2473,2454],{"class":158},[144,2475,2476],{"class":1253}," ||",[144,2478,2479],{"class":154}," echo",[144,2481,2482],{"class":158}," \"falló\"",[144,2484,2485],{"class":247},"  # avisa si falló\n",[261,2487,2489],{"id":2488},"bucles","Bucles",[84,2491,2493],{"className":1921,"code":2492,"language":1923,"meta":93,"style":93},"for archivo in main.c ft_putchar.c rush00.c; do\n    echo \"Revisando $archivo\"\ndone\n\ncontador=0\nwhile [[ $contador -lt 3 ]]; do\n    echo \"Vuelta $contador\"\n    contador=$((contador + 1))\ndone\n",[91,2494,2495,2520,2532,2537,2541,2551,2568,2580,2601],{"__ignoreMap":93},[144,2496,2497,2500,2503,2506,2508,2511,2514,2517],{"class":146,"line":147},[144,2498,2499],{"class":1253},"for",[144,2501,2502],{"class":1616}," archivo ",[144,2504,2505],{"class":1253},"in",[144,2507,1294],{"class":158},[144,2509,2510],{"class":158}," ft_putchar.c",[144,2512,2513],{"class":158}," rush00.c",[144,2515,2516],{"class":1616},"; ",[144,2518,2519],{"class":1253},"do\n",[144,2521,2522,2524,2527,2530],{"class":146,"line":251},[144,2523,2179],{"class":154},[144,2525,2526],{"class":158}," \"Revisando ",[144,2528,2529],{"class":1616},"$archivo",[144,2531,2226],{"class":158},[144,2533,2534],{"class":146,"line":519},[144,2535,2536],{"class":1253},"done\n",[144,2538,2539],{"class":146,"line":530},[144,2540,2152],{"emptyLinePlaceholder":2151},[144,2542,2543,2546,2548],{"class":146,"line":541},[144,2544,2545],{"class":1616},"contador",[144,2547,1620],{"class":1253},[144,2549,2550],{"class":158},"0\n",[144,2552,2553,2556,2559,2561,2564,2566],{"class":146,"line":672},[144,2554,2555],{"class":1253},"while",[144,2557,2558],{"class":1616}," [[ $contador ",[144,2560,2404],{"class":1253},[144,2562,2563],{"class":154}," 3",[144,2565,2171],{"class":1616},[144,2567,2519],{"class":1253},[144,2569,2570,2572,2575,2578],{"class":146,"line":685},[144,2571,2179],{"class":154},[144,2573,2574],{"class":158}," \"Vuelta ",[144,2576,2577],{"class":1616},"$contador",[144,2579,2226],{"class":158},[144,2581,2582,2585,2587,2590,2592,2595,2598],{"class":146,"line":2206},[144,2583,2584],{"class":1616},"    contador",[144,2586,1620],{"class":1253},[144,2588,2589],{"class":1616},"$((",[144,2591,2545],{"class":150},[144,2593,2594],{"class":158}," +",[144,2596,2597],{"class":154}," 1",[144,2599,2600],{"class":1616},"))\n",[144,2602,2603],{"class":146,"line":2211},[144,2604,2536],{"class":1253},[15,2606,2607],{},"Recorrer líneas de un archivo (el patrón correcto):",[84,2609,2611],{"className":1921,"code":2610,"language":1923,"meta":93,"style":93},"while IFS= read -r linea; do\n    echo \"→ $linea\"\ndone \u003C lista.txt\n",[91,2612,2613,2635,2647],{"__ignoreMap":93},[144,2614,2615,2617,2620,2622,2625,2628,2631,2633],{"class":146,"line":147},[144,2616,2555],{"class":1253},[144,2618,2619],{"class":1616}," IFS",[144,2621,1620],{"class":1253},[144,2623,2624],{"class":154}," read",[144,2626,2627],{"class":154}," -r",[144,2629,2630],{"class":158}," linea",[144,2632,2516],{"class":1616},[144,2634,2519],{"class":1253},[144,2636,2637,2639,2642,2645],{"class":146,"line":251},[144,2638,2179],{"class":154},[144,2640,2641],{"class":158}," \"→ ",[144,2643,2644],{"class":1616},"$linea",[144,2646,2226],{"class":158},[144,2648,2649,2652,2654],{"class":146,"line":519},[144,2650,2651],{"class":1253},"done",[144,2653,1281],{"class":1253},[144,2655,2656],{"class":1616}," lista.txt\n",[15,2658,2659,2662,2663,2665],{},[91,2660,2661],{},"IFS="," evita que se coman los espacios; ",[91,2664,766],{}," evita que se interpreten las\nbarras invertidas. Sin las dos, los archivos con espacios se rompen.",[261,2667,2669],{"id":2668},"funciones","Funciones",[84,2671,2673],{"className":1921,"code":2672,"language":1923,"meta":93,"style":93},"saludar() {\n    local nombre=\"$1\"\n    echo \"Hola, $nombre\"\n}\n\nsaludar \"laura\"\n",[91,2674,2675,2683,2699,2711,2716,2720],{"__ignoreMap":93},[144,2676,2677,2680],{"class":146,"line":147},[144,2678,2679],{"class":150},"saludar",[144,2681,2682],{"class":1616},"() {\n",[144,2684,2685,2688,2691,2693,2695,2697],{"class":146,"line":251},[144,2686,2687],{"class":1253},"    local",[144,2689,2690],{"class":1616}," nombre",[144,2692,1620],{"class":1253},[144,2694,1640],{"class":158},[144,2696,2092],{"class":154},[144,2698,2226],{"class":158},[144,2700,2701,2703,2706,2709],{"class":146,"line":519},[144,2702,2179],{"class":154},[144,2704,2705],{"class":158}," \"Hola, ",[144,2707,2708],{"class":1616},"$nombre",[144,2710,2226],{"class":158},[144,2712,2713],{"class":146,"line":530},[144,2714,2715],{"class":1616},"}\n",[144,2717,2718],{"class":146,"line":541},[144,2719,2152],{"emptyLinePlaceholder":2151},[144,2721,2722,2724],{"class":146,"line":672},[144,2723,2679],{"class":150},[144,2725,2726],{"class":158}," \"laura\"\n",[15,2728,2729,2732],{},[91,2730,2731],{},"local"," hace que la variable viva solo dentro de la función. Es el equivalente\na no contaminar el resto del script.",[19,2734,2736],{"id":2735},"script-completo-compilar-el-rush-00","Script completo: compilar el Rush 00",[15,2738,2739,2740,2743],{},"Guarda esto como ",[91,2741,2742],{},"compilar.sh"," en la raíz del repo:",[84,2745,2747],{"className":1921,"code":2746,"language":1923,"meta":93,"style":93},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -euo pipefail\n\nreadonly CARPETA=\"ex00\"\nreadonly ARCHIVOS=(\"main.c\" \"ft_putchar.c\" \"rush00.c\")\n\nfor archivo in \"${ARCHIVOS[@]}\"; do\n    if [[ ! -f \"$CARPETA\u002F$archivo\" ]]; then\n        echo \"Falta $CARPETA\u002F$archivo\" >&2\n        exit 1\n    fi\ndone\n\ngcc -Wall -Wextra -Werror \\\n    \"$CARPETA\u002Fmain.c\" \\\n    \"$CARPETA\u002Fft_putchar.c\" \\\n    \"$CARPETA\u002Frush00.c\" \\\n    -o rush00\n\necho \"Compilado: .\u002Frush00\"\n",[91,2748,2749,2753,2761,2765,2778,2802,2806,2833,2860,2878,2886,2892,2897,2902,2919,2932,2944,2956,2964,2969],{"__ignoreMap":93},[144,2750,2751],{"class":146,"line":147},[144,2752,1922],{"class":247},[144,2754,2755,2757,2759],{"class":146,"line":251},[144,2756,2006],{"class":154},[144,2758,2009],{"class":154},[144,2760,2012],{"class":158},[144,2762,2763],{"class":146,"line":519},[144,2764,2152],{"emptyLinePlaceholder":2151},[144,2766,2767,2770,2773,2775],{"class":146,"line":530},[144,2768,2769],{"class":1253},"readonly",[144,2771,2772],{"class":1616}," CARPETA",[144,2774,1620],{"class":1253},[144,2776,2777],{"class":158},"\"ex00\"\n",[144,2779,2780,2782,2785,2787,2790,2793,2796,2799],{"class":146,"line":541},[144,2781,2769],{"class":1253},[144,2783,2784],{"class":1616}," ARCHIVOS",[144,2786,1620],{"class":1253},[144,2788,2789],{"class":1616},"(",[144,2791,2792],{"class":158},"\"main.c\"",[144,2794,2795],{"class":158}," \"ft_putchar.c\"",[144,2797,2798],{"class":158}," \"rush00.c\"",[144,2800,2801],{"class":1616},")\n",[144,2803,2804],{"class":146,"line":672},[144,2805,2152],{"emptyLinePlaceholder":2151},[144,2807,2808,2810,2812,2814,2817,2820,2823,2826,2829,2831],{"class":146,"line":685},[144,2809,2499],{"class":1253},[144,2811,2502],{"class":1616},[144,2813,2505],{"class":1253},[144,2815,2816],{"class":158}," \"${",[144,2818,2819],{"class":1616},"ARCHIVOS",[144,2821,2822],{"class":158},"[",[144,2824,2825],{"class":1253},"@",[144,2827,2828],{"class":158},"]}\"",[144,2830,2516],{"class":1616},[144,2832,2519],{"class":1253},[144,2834,2835,2838,2840,2843,2845,2847,2850,2852,2854,2856,2858],{"class":146,"line":2206},[144,2836,2837],{"class":1253},"    if",[144,2839,2160],{"class":1616},[144,2841,2842],{"class":1253},"!",[144,2844,663],{"class":1253},[144,2846,1634],{"class":158},[144,2848,2849],{"class":1616},"$CARPETA",[144,2851,443],{"class":158},[144,2853,2529],{"class":1616},[144,2855,1640],{"class":158},[144,2857,2171],{"class":1616},[144,2859,2174],{"class":1253},[144,2861,2862,2865,2868,2870,2872,2874,2876],{"class":146,"line":2211},[144,2863,2864],{"class":154},"        echo",[144,2866,2867],{"class":158}," \"Falta ",[144,2869,2849],{"class":1616},[144,2871,443],{"class":158},[144,2873,2529],{"class":1616},[144,2875,1640],{"class":158},[144,2877,2190],{"class":1253},[144,2879,2881,2884],{"class":146,"line":2880},10,[144,2882,2883],{"class":154},"        exit",[144,2885,2198],{"class":154},[144,2887,2889],{"class":146,"line":2888},11,[144,2890,2891],{"class":1253},"    fi\n",[144,2893,2895],{"class":146,"line":2894},12,[144,2896,2536],{"class":1253},[144,2898,2900],{"class":146,"line":2899},13,[144,2901,2152],{"emptyLinePlaceholder":2151},[144,2903,2905,2907,2910,2913,2916],{"class":146,"line":2904},14,[144,2906,1291],{"class":150},[144,2908,2909],{"class":154}," -Wall",[144,2911,2912],{"class":154}," -Wextra",[144,2914,2915],{"class":154}," -Werror",[144,2917,2918],{"class":154}," \\\n",[144,2920,2922,2925,2927,2930],{"class":146,"line":2921},15,[144,2923,2924],{"class":158},"    \"",[144,2926,2849],{"class":1616},[144,2928,2929],{"class":158},"\u002Fmain.c\"",[144,2931,2918],{"class":154},[144,2933,2935,2937,2939,2942],{"class":146,"line":2934},16,[144,2936,2924],{"class":158},[144,2938,2849],{"class":1616},[144,2940,2941],{"class":158},"\u002Fft_putchar.c\"",[144,2943,2918],{"class":154},[144,2945,2947,2949,2951,2954],{"class":146,"line":2946},17,[144,2948,2924],{"class":158},[144,2950,2849],{"class":1616},[144,2952,2953],{"class":158},"\u002Frush00.c\"",[144,2955,2918],{"class":154},[144,2957,2959,2962],{"class":146,"line":2958},18,[144,2960,2961],{"class":154},"    -o",[144,2963,951],{"class":158},[144,2965,2967],{"class":146,"line":2966},19,[144,2968,2152],{"emptyLinePlaceholder":2151},[144,2970,2972,2974],{"class":146,"line":2971},20,[144,2973,1631],{"class":154},[144,2975,2976],{"class":158}," \"Compilado: .\u002Frush00\"\n",[15,2978,2979],{},"Se ejecuta así:",[84,2981,2983],{"className":138,"code":2982,"language":140,"meta":93,"style":93},"chmod +x compilar.sh\n.\u002Fcompilar.sh\n.\u002Frush00\n",[91,2984,2985,2994,2999],{"__ignoreMap":93},[144,2986,2987,2989,2991],{"class":146,"line":147},[144,2988,1072],{"class":150},[144,2990,1075],{"class":158},[144,2992,2993],{"class":158}," compilar.sh\n",[144,2995,2996],{"class":146,"line":251},[144,2997,2998],{"class":150},".\u002Fcompilar.sh\n",[144,3000,3001],{"class":146,"line":519},[144,3002,3003],{"class":150},".\u002Frush00\n",[15,3005,3006],{},"Cosas para mirar en el script:",[27,3008,3009,3019],{},[30,3010,3011],{},[33,3012,3013,3016],{},[36,3014,3015],{},"Línea",[36,3017,3018],{},"Por qué está",[46,3020,3021,3031,3040,3050,3060,3070,3083],{},[33,3022,3023,3028],{},[51,3024,3025],{},[91,3026,3027],{},"set -euo pipefail",[51,3029,3030],{},"si algo falla, se entera",[33,3032,3033,3037],{},[51,3034,3035],{},[91,3036,2769],{},[51,3038,3039],{},"evita que se reasignen por accidente",[33,3041,3042,3047],{},[51,3043,3044],{},[91,3045,3046],{},"ARCHIVOS=(...)",[51,3048,3049],{},"un array: varios valores en una variable",[33,3051,3052,3057],{},[51,3053,3054],{},[91,3055,3056],{},"\"${ARCHIVOS[@]}\"",[51,3058,3059],{},"recorre el array respetando espacios",[33,3061,3062,3067],{},[51,3063,3064],{},[91,3065,3066],{},"[[ ! -f ... ]]",[51,3068,3069],{},"verifica antes de compilar",[33,3071,3072,3080],{},[51,3073,3074,3076,3077],{},[91,3075,2231],{}," + ",[91,3078,3079],{},"exit 1",[51,3081,3082],{},"error claro y código de salida correcto",[33,3084,3085,3091],{},[51,3086,3087,3090],{},[91,3088,3089],{},"\\"," al final de línea",[51,3092,3093],{},"continúa el comando en la línea siguiente",[118,3095,3096],{},[15,3097,3098,3099,3102,3103,3105],{},"Un script que termina con ",[91,3100,3101],{},"exit 0"," implícito \"dijo que salió bien\". Si tu\nscript detecta un problema, tiene que devolver un código distinto de cero.\nAsí ",[91,3104,2432],{}," y los sistemas de CI pueden reaccionar.",[261,3107,3109],{"id":3108},"revisar-scripts-con-shellcheck","Revisar scripts con ShellCheck",[15,3111,3112,3115],{},[91,3113,3114],{},"shellcheck"," es un linter de bash: te marca comillas faltantes, variables sin\nusar, comparaciones mal escritas y decenas de trampas más.",[84,3117,3119],{"className":138,"code":3118,"language":140,"meta":93,"style":93},"shellcheck compilar.sh\n",[91,3120,3121],{"__ignoreMap":93},[144,3122,3123,3125],{"class":146,"line":147},[144,3124,3114],{"class":150},[144,3126,2993],{"class":158},[15,3128,3129],{},"Si no está instalado, buscalo en el gestor de paquetes de tu sistema. Es de las\nmejores inversiones de cinco minutos que existen.",[19,3131,3133],{"id":3132},"errores-típicos-de-scripting","Errores típicos de scripting",[27,3135,3136,3149],{},[30,3137,3138],{},[33,3139,3140,3143,3146],{},[36,3141,3142],{},"Error",[36,3144,3145],{},"Por qué falla",[36,3147,3148],{},"Solución",[46,3150,3151,3166,3181,3197,3214,3233,3248,3264,3281],{},[33,3152,3153,3158,3161],{},[51,3154,3155],{},[91,3156,3157],{},"VAR = 1",[51,3159,3160],{},"los espacios convierten la asignación en un comando",[51,3162,3163],{},[91,3164,3165],{},"VAR=1",[33,3167,3168,3174,3177],{},[51,3169,3170,3173],{},[91,3171,3172],{},"$VAR"," sin comillas",[51,3175,3176],{},"se rompe con espacios y globs",[51,3178,3179],{},[91,3180,1790],{},[33,3182,3183,3189,3192],{},[51,3184,3185,3188],{},[91,3186,3187],{},"cd carpeta"," sin verificar",[51,3190,3191],{},"si falla, sigues operando en la carpeta equivocada",[51,3193,3194],{},[91,3195,3196],{},"cd carpeta || exit 1",[33,3198,3199,3204,3207],{},[51,3200,3201],{},[91,3202,3203],{},"for f in $(ls)",[51,3205,3206],{},"se rompe con nombres con espacios",[51,3208,3209,414,3212],{},[91,3210,3211],{},"for f in *",[91,3213,852],{},[33,3215,3216,3225,3228],{},[51,3217,3218,3221,3222,3224],{},[91,3219,3220],{},"[ $x = y ]"," con ",[91,3223,1048],{}," vacío",[51,3226,3227],{},"error de sintaxis",[51,3229,3230],{},[91,3231,3232],{},"[[ \"$x\" == \"y\" ]]",[33,3234,3235,3240,3243],{},[51,3236,3237,3239],{},[91,3238,1944],{}," en otro sistema",[51,3241,3242],{},"bash puede estar en otra ruta",[51,3244,3245],{},[91,3246,3247],{},"#!\u002Fusr\u002Fbin\u002Fenv bash",[33,3249,3250,3253,3259],{},[51,3251,3252],{},"CRLF en el shebang",[51,3254,3255,3256],{},"el sistema busca ",[91,3257,3258],{},"bash\\r",[51,3260,3261],{},[91,3262,3263],{},"dos2unix script.sh",[33,3265,3266,3272,3275],{},[51,3267,3268,3271],{},[91,3269,3270],{},"rm -rf"," con variable vacía",[51,3273,3274],{},"borra desde la raíz",[51,3276,3277,3280],{},[91,3278,3279],{},"set -u"," y comillas",[33,3282,3283,3288,3292],{},[51,3284,3285,3286],{},"script sin ",[91,3287,1164],{},[51,3289,3290],{},[91,3291,1160],{},[51,3293,3294],{},[91,3295,1164],{},[19,3297,3299],{"id":3298},"chuleta","Chuleta",[27,3301,3302,3311],{},[30,3303,3304],{},[33,3305,3306,3309],{},[36,3307,3308],{},"Necesito",[36,3310,707],{},[46,3312,3313,3322,3332,3342,3352,3362,3372,3382,3392,3401,3411,3421,3431,3441,3450,3460,3469,3479,3489],{},[33,3314,3315,3318],{},[51,3316,3317],{},"saber dónde estoy",[51,3319,3320],{},[91,3321,502],{},[33,3323,3324,3327],{},[51,3325,3326],{},"listar con detalles",[51,3328,3329],{},[91,3330,3331],{},"ls -la",[33,3333,3334,3337],{},[51,3335,3336],{},"cambiar de carpeta",[51,3338,3339],{},[91,3340,3341],{},"cd ruta",[33,3343,3344,3347],{},[51,3345,3346],{},"crear carpeta",[51,3348,3349],{},[91,3350,3351],{},"mkdir -p ruta",[33,3353,3354,3357],{},[51,3355,3356],{},"ver un archivo",[51,3358,3359],{},[91,3360,3361],{},"less archivo",[33,3363,3364,3367],{},[51,3365,3366],{},"buscar texto",[51,3368,3369],{},[91,3370,3371],{},"grep -rn \"texto\" .",[33,3373,3374,3377],{},[51,3375,3376],{},"buscar archivos",[51,3378,3379],{},[91,3380,3381],{},"find . -name \"*.c\"",[33,3383,3384,3387],{},[51,3385,3386],{},"copiar carpeta",[51,3388,3389],{},[91,3390,3391],{},"cp -r origen destino",[33,3393,3394,3397],{},[51,3395,3396],{},"borrar con cuidado",[51,3398,3399],{},[91,3400,802],{},[33,3402,3403,3406],{},[51,3404,3405],{},"ver permisos",[51,3407,3408],{},[91,3409,3410],{},"ls -l",[33,3412,3413,3416],{},[51,3414,3415],{},"hacer ejecutable",[51,3417,3418],{},[91,3419,3420],{},"chmod +x archivo",[33,3422,3423,3426],{},[51,3424,3425],{},"guardar salida",[51,3427,3428],{},[91,3429,3430],{},"comando > archivo",[33,3432,3433,3436],{},[51,3434,3435],{},"encadenar",[51,3437,3438],{},[91,3439,3440],{},"comando1 | comando2",[33,3442,3443,3446],{},[51,3444,3445],{},"ver procesos",[51,3447,3448],{},[91,3449,1599],{},[33,3451,3452,3455],{},[51,3453,3454],{},"matar proceso",[51,3456,3457],{},[91,3458,3459],{},"kill PID",[33,3461,3462,3465],{},[51,3463,3464],{},"buscar en historial",[51,3466,3467],{},[91,3468,319],{},[33,3470,3471,3474],{},[51,3472,3473],{},"ver variable",[51,3475,3476],{},[91,3477,3478],{},"echo \"$PATH\"",[33,3480,3481,3484],{},[51,3482,3483],{},"editar config",[51,3485,3486],{},[91,3487,3488],{},"vim ~\u002F.bashrc",[33,3490,3491,3494],{},[51,3492,3493],{},"recargar config",[51,3495,3496],{},[91,3497,3498],{},"source ~\u002F.bashrc",[15,3500,3501,3502,228],{},"Siguiente parada: ",[3503,3504,3506],"a",{"href":3505},"\u002Fgit","Git y GitHub Flow",[3508,3509],"hr",{},[15,3511,3512],{},[3513,3514,3515],"em",{},"Hecho con amor para Laura, por Bogdan.",[3517,3518,3519],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":93,"searchDepth":251,"depth":251,"links":3521},[3522,3523,3526,3527,3528,3529,3530,3531,3532,3533,3536,3543,3546,3547],{"id":21,"depth":251,"text":22},{"id":134,"depth":251,"text":135,"children":3524},[3525],{"id":263,"depth":519,"text":264},{"id":367,"depth":251,"text":368},{"id":552,"depth":251,"text":553},{"id":697,"depth":251,"text":698},{"id":841,"depth":251,"text":842},{"id":936,"depth":251,"text":937},{"id":1168,"depth":251,"text":1169},{"id":1458,"depth":251,"text":1459},{"id":1602,"depth":251,"text":1603,"children":3534},[3535],{"id":1794,"depth":519,"text":1795},{"id":1910,"depth":251,"text":1911,"children":3537},[3538,3539,3540,3541,3542],{"id":1991,"depth":519,"text":1992},{"id":2061,"depth":519,"text":2062},{"id":2235,"depth":519,"text":2236},{"id":2488,"depth":519,"text":2489},{"id":2668,"depth":519,"text":2669},{"id":2735,"depth":251,"text":2736,"children":3544},[3545],{"id":3108,"depth":519,"text":3109},{"id":3132,"depth":251,"text":3133},{"id":3298,"depth":251,"text":3299},"Comandos básicos, permisos, pipes, procesos y scripting con un script real del rush.","md",{},"\u002Fterminal",{"title":5,"description":3548},"terminal","7C3wDT2BsBbQijGFu9DfjduR7LthlnkG42QKlXgeCvk",1793539815759]