2017-11-12 4 views
0

.bash_profile에 몇 가지 별칭을 추가하여 Mac에서 작곡가 PHP/Composer 프로젝트를보다 쉽게 ​​설정할 수 있도록 노력하고 있습니다. 매우 가까이에 있습니다. 이 작업을 완료했지만 문제가 발생했습니다. 내가 만드는 파일에 문자열을 출력하려고하지만 작은 따옴표가 계속 삭제됩니다.Mac에서 Terminal의 echo 문에서 이스케이프 값

는 다음과 내가 설정하고있어 별명대로 :

alias sp='touch index.php; echo "<?php \n\n require_once __DIR__ . $ '/vendor/autoload.php' ?>;" >> index.php; open/Applications/TextWrangler.app index.php;' 

내가 PHP 파일에서지고있어 출력은 다음과 같습니다

<?php \n\n require_once __DIR__ . $ /vendor/autoload.php \n\n ?> 

나는 \ E를 이용하여 탈출 시도했습니다 $ 'string'

하지만 운이 없었습니다.

답변

3

짧은 대답 : 별칭을 쓰지 않을 때는 대신 echo 대신 함수를 사용하십시오.

긴 대답 : 즉각적인 문제는 따옴표가 중첩되지 않는다는 것입니다. 작은 따옴표가 포함 된 별칭을 작은 따옴표로 묶으려고하면 제대로 작동하지 않습니다. 셸이 작은 따옴표로 묶인 세그먼트 'touch index.php; echo "<?php \n\n require_once __DIR__ . $ '을 포함하는 것으로 구문 분석하고 인용 부호가없는 세그먼트 /vendor/autoload.php과 그 뒤에 작은 따옴표 ' ?>;" >> index.php; open/Applications/TextWrangler.app index.php;'이옵니다. 따옴표를 제거하고 함께 뭉친 다음 결과를 별칭으로 할당합니다.

이 문제를 해결할 수있는 방법이 있지만 추한 것입니다. alias sp='touch ... $ '"'"'/vendor/...과 같은 것 - 여기서 첫 번째 작은 따옴표는 작은 따옴표로 묶은 세그먼트를 끝내고 작은 따옴표가 들어있는 큰 따옴표로 묶은 다음 다른 작은 따옴표로 묶인 세그먼트의 시작 부분을 포함합니다. 블레.

별칭을 정의 할 때 복잡해 지므로 함수로 전환하는 것이 좋습니다. 이 모든 문제는 논쟁 그래서 무엇보다도 그들이 인용 할 필요가 없습니다 :

sp() { 
    touch index.php 
    echo "<?php \n\n require_once __DIR__ . $ '/vendor/autoload.php' ?>;" >> index.php 
    open/Applications/TextWrangler.app index.php 
} 

그러나만큼 내가 제안을 해요, 나는 다른 변화의 몇 가지를 만들 것입니다. 첫째, touch 명령은 리디렉션이 어쨌든하지 않으므로 아무 것도하지 않으므로 그대로 두십시오. 둘째, \necho과 함께 사용하는 것은 예측할 수 없습니다. 일부 버전의 echo은 개행 문자로 변환하지만 일부 문자는 개행하지 않습니다. OS X의 다른 버전간에 실제로 바뀌 었습니다. printf을 사용하는 것이 더 낫습니다. 제대로 사용하는 것이 더 복잡하지만 훨씬 좋습니다. printf의 첫 번째 인수는 나머지 인수가 인쇄되는 방식을 제어하는 ​​데 사용되는 형식 문자열입니다. echo과 다른 큰 차이점은 자동으로 마지막에 개행을 추가하지 않기 때문에 직접해야한다는 것입니다. 난 당신이 index.php 파일에이를 데려 가고 싶다는 있으리라 믿고있어 :

<?php 

require_once __DIR__ . $ '/vendor/autoload.php' 

?> 

printf이 작업을 수행하는 방법은 여러 가지가 있습니다.

printf '%s\n' "<?php" "" "require_once __DIR__ . \$ '/vendor/autoload.php'" "" "?>" 

을하지만,이 경우 나는 여기-문서 cat을 사용하십시오 : 아마 가장 간단한 각 줄 인수 만들고, 각각의 후 개행 문자를 넣어 형식 문자열을 사용하는 것입니다.당신이 청소기 들여 쓰기를 원하는 경우에, 당신은 또한 <<-"EOF"을 사용할 수 있습니다

sp() { 
    cat <<"EOF" >>index.html 
<?php 

require_once __DIR__ . $ '/vendor/autoload.php' 

?> 
EOF 
    open/Applications/TextWrangler.app index.php 
} 

다음 탭 여기에-문서의 내용 (하지 공간)을 들여 : 당신은 (별명과는 달리) 함수 내에서 그렇게 할 수 있습니다.

+0

위대한 답변! 모든 정보를 매우 감사합니다. –