쉘 스크립트에서 파일 크기를 인쇄하는 방법은 무엇입니까?

쉘 스크립트에서 파일 크기를 인쇄하는 방법은 무엇입니까?

CICD 파이프라인에서 Fastlane을 사용하여 압축된 빌드 파일의 크기를 기록하려고 합니다. 명령줄에서 이것을 시도하면:

du -h fileName.ipa | awk '{print $1}'

좋은 결과. 그러나 다음과 같이 스크립트에 넣으려고 하면 다음과 같습니다.

sh '''
  # Add filesize to release message
  
  var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
  fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
  echo "$buildInfo"
  sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
  '''

다음과 같은 구문 오류가 발생합니다.

[17:50:24]:     262:          var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
[17:50:24]:  => 263:          fileSizeInfo=(du -h '"#{IPA_FILE_PATH}"'$fileName | awk '{print $1}')
[17:50:24]:     264:          echo "$buildInfo"
[17:50:24]:     265:          sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
[!] Syntax error in your Fastfile on line 263: Fastfile:263: syntax error, unexpected '{', expecting `end'
..._FILE_PATH}"'$fileName | awk '{print $1}')
...                              ^
Fastfile:285: syntax error, unexpected `end', expecting end-of-input
    end
    ^~~

저는 쉘 스크립팅이 처음이므로 도움을 주시면 감사하겠습니다. 잘못된 위치에서 인용했을 수도 있습니다. 도움이 된다면 Fastlane은 Ruby 구문을 사용하므로 거기에 Ruby 문자열 보간법이 있습니다.

편집하다:

자세한 내용을 위해 빠른 파일에서 호출하는 전체 패스는 다음과 같습니다.

# Send message MS Teams Channel
    lane:sendTeamsMessage do |options|
=begin
  MS Teams messages are sent using webhooks and it got limited support to HTML and Markdown. 
  This implementation uses HTML formatted message.
  Webhook will not accept new lines or double quotes because it can break the JSON struture.
  The message file preparation is done in multiple steps.
  1. Add .ipa file size info to release message HTML
  2. Replace all double quotes with single quotes  
  3. Copy the Teams message payload template and update it with the message content
  4. Replace 'MESSAGE_INFO' string with the HTML formatted content file
  5. Send the message to Teams channel
=end
      sh '''
      # Add filesize to release message
      
      var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`
      var fullFilePath='"#{IPA_FILE_PATH}"'$fileName
      echo fullFilePath
      fileSizeInfo=(du -h $fullFilePath | awk '{print $1}')
      echo "$buildInfo"
      sed -i -e "s|FILESIZE_INFO|'"$fileSizeInfo"'|g" '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"'
      '''

      sh '''
      # Copy the release message html file
      cp -fr '"#{RELEASE_MESSAGE_HTML_FILE_NAME}"' '"#{TEAMS_MESSAGE_FILE_NAME}"'
      '''
      # Replace all double quotes with single quotes to make it JSON friendly
      sh("sed","-i","-e","s|\"|\'|g","#{TEAMS_MESSAGE_FILE_NAME}")

      sh'''
      cp -fr '"#{TEAMS_PAYLOAD_TEMPLATE_FILE_NAME}"' '"#{TEAMS_PAYLOAD_FILE_NAME}"'
      message=`cat '"#{TEAMS_MESSAGE_FILE_NAME}"'`
      sed -i -e "s|MESSAGE_INFO|'"$message"'|g" '"#{TEAMS_PAYLOAD_FILE_NAME}"'
      '''
      # Send the message to Teams channel
      sh '''
      echo '"#{options[:webhook]}"'
      curl -H "Content-Type: application/json" -d @'"#{TEAMS_PAYLOAD_FILE_NAME}"' '"#{options[:webhook]}"'
      '''
    end

파일 경로/이름을 자체 변수로 이동하려고 시도했지만 여전히 동일한 문제가 있습니다.

답변1

bash명령 출력을 캡처하는 관용구는 다음과 같습니다.

du -h fileName.ipa | awk '{print $1}'

출력을 변수에 저장하는 것은 다음과 같습니다.

fileSizeInfo=$(du -h fileName.ipa | awk '{print $1}')

$이는 코드 에 누락된 점을 제외하면 스크립트의 Bash 부분에 있는 줄과 매우 유사합니다 (. 이것이 혼란스러운 출력의 주요 원인인 것 같습니다.

답변2

한번 해보고 싶으신 것 같군요명령 대체.

귀하의 예에서는

var fileName=`cat '"#{IPA_FILE_NAME_FILE}"'`

유효한 명령 대체로.

두 번째 명령은 누락으로 인해 대체됩니다 $.

fileSizeInfo=$(du -h $fullFilePath | awk '{print $1}')

사용 가능한 두 가지 명령 대체 bash는 현대적입니다.POSIX스타일

$(command)

또는 오래된 스타일

`command`

가독성을 높이려면 첫 번째 것을 사용하는 것이 좋습니다.

코드를 더 읽기 쉽게 만들고 싶다면 말한 대로 작성해 보세요. 파이프와 다른 명령 없이 더 읽기 쉬운 방식으로 파일 크기를 얻는 또 다른 방법은 다음과 같습니다.

stat -c "%s" /path/to/file

귀하의 예에서 시도해 볼 수 있습니다

fileSizeInfo=$(stat -c "%s" $fullFilePath)

답변3

Ruby에서는 다음을 사용할 수 있습니다.

File.stat("/path/to/file").size

관련 정보